From e6d8fc568904c36319c44a87a6e103b32ad6e8f8 Mon Sep 17 00:00:00 2001 From: bertrand Date: Thu, 15 Feb 2024 21:45:05 +0100 Subject: [PATCH 01/15] added service --- .Rprofile | 2 - .gitignore | 1 + app/logic/cloud_logic.R | 41 + app/logic/constant.R | 7 +- app/logic/data_load.R | 78 +- app/logic/data_write.R | 43 + app/logic/trisk_button_logic.R | 91 ++ app/logic/trisk_mgmt.R | 98 +- app/view/crispy_equities.R | 8 +- app/view/crispy_loans.R | 28 +- .../modules/{trisk_mgmt.R => trisk_button.R} | 123 +- scripts/install_py_env.R | 2 + scripts/python/__init__.py | 0 scripts/python/fuzzy_match.py | 7 - scripts/trisk_k8s_api/.Rprofile | 1 + scripts/trisk_k8s_api/Dockerfile | 58 + scripts/trisk_k8s_api/main.py | 35 + scripts/trisk_k8s_api/readme.md | 57 + scripts/trisk_k8s_api/renv.lock | 921 +++++++++++++++ scripts/trisk_k8s_api/renv/.gitignore | 7 + scripts/trisk_k8s_api/renv/activate.R | 1032 +++++++++++++++++ scripts/trisk_k8s_api/trisk_compute.R | 101 ++ 22 files changed, 2517 insertions(+), 224 deletions(-) create mode 100644 app/logic/cloud_logic.R create mode 100644 app/logic/data_write.R create mode 100644 app/logic/trisk_button_logic.R rename app/view/modules/{trisk_mgmt.R => trisk_button.R} (53%) delete mode 100644 scripts/python/__init__.py delete mode 100644 scripts/python/fuzzy_match.py create mode 100644 scripts/trisk_k8s_api/.Rprofile create mode 100644 scripts/trisk_k8s_api/Dockerfile create mode 100644 scripts/trisk_k8s_api/main.py create mode 100644 scripts/trisk_k8s_api/readme.md create mode 100644 scripts/trisk_k8s_api/renv.lock create mode 100644 scripts/trisk_k8s_api/renv/.gitignore create mode 100644 scripts/trisk_k8s_api/renv/activate.R create mode 100644 scripts/trisk_k8s_api/trisk_compute.R diff --git a/.Rprofile b/.Rprofile index a60e829..224b9c5 100644 --- a/.Rprofile +++ b/.Rprofile @@ -9,7 +9,5 @@ if (file.exists("renv")) { options(box.path = getwd()) -# ENV VARIABLES - Sys.setenv(TRISK_INPUT_PATH = file.path("app", "data", "st_inputs")) Sys.setenv(BACKEND_TRISK_RUN_FOLDER = file.path("app", "data", "backend_db")) diff --git a/.gitignore b/.gitignore index d98a16c..3af5a60 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ .Ruserdata .DS_Store .vscode +.Renviron rsconnect # project specific diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R new file mode 100644 index 0000000..7d72782 --- /dev/null +++ b/app/logic/cloud_logic.R @@ -0,0 +1,41 @@ +trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint){ + print("in api") + browser() + + + # curl -X 'POST' \ + # 'http://188.166.192.175/compute_trisk/' \ + # -H 'Content-Type: application/json' \ + # -d '{"trisk_run_params": {...}}' +} + + +get_data_from_postgres <- function( + table_name, + dbname, + host_db, + db_port, + db_user, + db_password, + query_filter +) { + browser() + # Create a connection string + conn <- DBI::dbConnect(RPostgres::Postgres(), + dbname = dbname, + host = host_db, + port = db_port, + user = db_user, + password = db_password) + + # Construct the SQL query + query <- paste("SELECT * FROM", table_name, "WHERE", query_filter) + + # Execute the query and fetch results + data <- DBI::dbGetQuery(conn, query) + + # Close the connection + DBI::dbDisconnect(conn) + + return(data) +} diff --git a/app/logic/constant.R b/app/logic/constant.R index 584557e..3b8e671 100644 --- a/app/logic/constant.R +++ b/app/logic/constant.R @@ -4,6 +4,7 @@ trisk_input_path <- Sys.getenv("TRISK_INPUT_PATH") backend_trisk_run_folder <- Sys.getenv("BACKEND_TRISK_RUN_FOLDER") +api_endpoint <- Sys.getenv("TRISK_API_ENDPOINT") # PROJECT CONSTANTS ==================================== @@ -82,9 +83,9 @@ hide_vars <- list( # "NGFS2023_REMIND_NZ2050", # "NGFS2023_MESSAGE_NZ2050", # "NGFS2023_GCAM_NZ2050", - # "NGFS2023_REMIND_DT", - # "NGFS2023_MESSAGE_DT", - # "NGFS2023_GCAM_DT", + "NGFS2023_REMIND_DT", + "NGFS2023_MESSAGE_DT", + "NGFS2023_GCAM_DT" # "NGFS2023_REMIND_DN0", # "NGFS2023_MESSAGE_DN0", # "NGFS2023_GCAM_DN0", diff --git a/app/logic/data_load.R b/app/logic/data_load.R index bb3cb16..0ba5933 100644 --- a/app/logic/data_load.R +++ b/app/logic/data_load.R @@ -1,10 +1,43 @@ -load_backend_crispy_data <- function(backend_trisk_run_folder) { - backend_crispy_data_path <- fs::path(backend_trisk_run_folder, "crispy_output", ext = "parquet") +box::use( + app/logic/cloud_logic[ + get_data_from_postgres + ] +) - if (file.exists(backend_crispy_data_path)) { - backend_crispy_data <- arrow::read_parquet(backend_crispy_data_path) +base_data_load <- function(table_name, run_id = NULL, backend_trisk_run_folder = NULL, default_tibble = NULL) { + if (Sys.getenv("CRISPY_APP_ENV") == "dev") { + table_data_path <- fs::path(backend_trisk_run_folder, table_name, ext = "parquet") + if (file.exists(table_data_path)) { + table_data <- arrow::read_parquet(table_data_path) |> + dplyr::filter(.data$run_id == run_id) + } else { + table_data <- default_tibble + } + } else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { + table_data <- get_data_from_postgres( + table_name = table_name, + dbname = Sys.getenv("ST_POSTGRES_DB"), + host_db = Sys.getenv("ST_POSTGRES_HOST"), + db_port = Sys.getenv("ST_POSTGRES_PORT"), + db_user = Sys.getenv("ST_POSTGRES_USERNAME"), + db_password = Sys.getenv("ST_POSTGRES_PASSWORD"), + query_filter=paste0("run_id = '", run_id, "'") + ) } else { - backend_crispy_data <- tibble::tibble( + stop("must fill in a backend_trisk_run_folder") + } + + return(table_data) +} + + + +load_backend_crispy_data <- function(backend_trisk_run_folder, run_id = NULL) { + backend_crispy_data <- base_data_load( + table_name = "crispy_output", + run_id = run_id, + backend_trisk_run_folder = backend_trisk_run_folder, + default_tibble = tibble::tibble( run_id = character(), company_id = character(), ald_sector = character(), @@ -15,16 +48,17 @@ load_backend_crispy_data <- function(backend_trisk_run_folder) { pd_baseline = numeric(), pd_shock = numeric() ) - } + ) return(backend_crispy_data) } -load_backend_trajectories_data <- function(backend_trisk_run_folder) { - backend_trajectories_data_path <- fs::path(backend_trisk_run_folder, "company_trajectories", ext = "parquet") - if (file.exists(backend_trajectories_data_path)) { - backend_trajectories_data <- arrow::read_parquet(backend_trajectories_data_path) - } else { - backend_trajectories_data <- tibble::tibble( + +load_backend_trajectories_data <- function(backend_trisk_run_folder, run_id = NULL) { + backend_trajectories_data <- base_data_load( + table_name = "company_trajectories", + run_id = run_id, + backend_trisk_run_folder = backend_trisk_run_folder, + default_tibble = tibble::tibble( run_id = character(), year = numeric(), company_id = character(), @@ -34,17 +68,17 @@ load_backend_trajectories_data <- function(backend_trisk_run_folder) { production_target_scenario = numeric(), production_shock_scenario = numeric() ) - } - + ) return(backend_trajectories_data) } -load_backend_trisk_run_metadata <- function(backend_trisk_run_folder) { - backend_trisk_run_metadata_path <- fs::path(backend_trisk_run_folder, "run_metadata", ext = "parquet") - if (file.exists(backend_trisk_run_metadata_path)) { - backend_trisk_run_metadata <- arrow::read_parquet(backend_trisk_run_metadata_path) - } else { - backend_trisk_run_metadata <- tibble::tibble( + +load_backend_trisk_run_metadata <- function(backend_trisk_run_folder, run_id = NULL) { + backend_trisk_run_metadata_path <- base_data_load( + table_name = "run_metadata", + run_id = run_id, + backend_trisk_run_folder = backend_trisk_run_folder, + default_tibble = tibble::tibble( run_id = character(), roll_up_type = character(), baseline_scenario = character(), @@ -60,6 +94,8 @@ load_backend_trisk_run_metadata <- function(backend_trisk_run_folder) { carbon_price_model = character(), market_passthrough = numeric() ) - } + ) + return(backend_trisk_run_metadata) } + diff --git a/app/logic/data_write.R b/app/logic/data_write.R new file mode 100644 index 0000000..90b2b4a --- /dev/null +++ b/app/logic/data_write.R @@ -0,0 +1,43 @@ +# Function to append stress test results to backend data +# It iterates over the names of the results, processes the data accordingly and appends it to the existing data +# The updated data is then written back to the file +append_st_results_to_backend_data <- function( + st_results_wrangled_and_checked, + backend_trisk_run_folder, + max_trisk_granularity) { + # Iterate over the names of the results + for (fname in names(st_results_wrangled_and_checked)) { + # Get the new data from the results + new_data <- st_results_wrangled_and_checked[[fname]] + + # Process the new data based on its name + if (fname == "crispy_output") { + new_data <- new_data |> + dplyr::mutate(company_id = as.character(company_id)) |> + stress.test.plot.report::main_load_multi_crispy_data(granularity = names(max_trisk_granularity)) + } else if (fname == "company_trajectories") { + new_data <- new_data |> + stress.test.plot.report::main_data_load_trajectories_data(granularity = names(max_trisk_granularity)) + } + + # Get the path of the file to write the data to + fpath <- fs::path(backend_trisk_run_folder, fname, ext = "parquet") + + # If the file exists, read the existing data, otherwise set the existing data to NULL + if (file.exists(fpath)) { + persistent_data <- read_parquet(fpath) + } else { + persistent_data <- NULL + } + + # Append the new data to the existing data + persistent_data <- bind_rows(persistent_data, new_data) + + # Write the updated data back to the file + write_parquet(persistent_data, fpath) + + } + return(run_id) +} + + diff --git a/app/logic/trisk_button_logic.R b/app/logic/trisk_button_logic.R new file mode 100644 index 0000000..50910af --- /dev/null +++ b/app/logic/trisk_button_logic.R @@ -0,0 +1,91 @@ +box::use( + app/logic/trisk_mgmt[ + run_trisk_with_params + ], + app/logic/cloud_logic[ + trigger_trisk_api_computation, + ], + app/logic/data_load[ + load_backend_trisk_run_metadata + ], + app/logic/data_write[ + append_st_results_to_backend_data + ] +) + + +# Function to check if a run exists based on the given trisk run parameters +# Returns the run_id if the run exists, NULL otherwise +check_if_run_exists <- function(trisk_run_params, backend_trisk_run_folder) { + # Load the backend trisk run metadata + backend_trisk_run_metadata <- load_backend_trisk_run_metadata(backend_trisk_run_folder) + + # Filter the metadata based on the provided trisk run parameters + df <- backend_trisk_run_metadata + for (trisk_param in names(trisk_run_params)) { + df <- df |> dplyr::filter(!!rlang::sym(trisk_param) == trisk_run_params[[trisk_param]]) + } + + # If a single run is found, return its run_id, otherwise return NULL or throw an error + if (nrow(df) == 1) { + run_id <- df |> dplyr::pull(run_id) + } else if (nrow(df) == 0) { + run_id <- NULL + } else { + stop("More than 1 run have been found with the provided trisk input parameters") + } + + # Return the run_id + return(run_id) +} + + + +# fetch or create a trisk run +trisk_generator <- function( + backend_trisk_run_folder, + trisk_input_path, + trisk_run_params, + max_trisk_granularity) { + + # Check if the run already exists (locally OR in database) + run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) + + if (!is.null(run_id)) { + if (Sys.getenv("CRISPY_APP_ENV") == "dev") { + st_results_wrangled_and_checked <- tryCatch( + { + run_trisk_with_params( + trisk_run_params, + trisk_input_path + ) + }, + error = function(e) { + print(e$message) + print("\n\n") + format_error_message(trisk_run_params) + NULL + } + ) + + if (!is.null(st_results_wrangled_and_checked)) { + run_id <- append_st_results_to_backend_data( + st_results_wrangled_and_checked, + backend_trisk_run_folder, + max_trisk_granularity + ) + + } + } + else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { + run_id <- trigger_trisk_api_computation(trisk_run_params) + } else { + stop("must set environment variable CRISPY_APP_ENV to 'dev' or 'prod'") + } + } + return(run_id) +} + + + + diff --git a/app/logic/trisk_mgmt.R b/app/logic/trisk_mgmt.R index f8c57ef..519a0e9 100644 --- a/app/logic/trisk_mgmt.R +++ b/app/logic/trisk_mgmt.R @@ -7,6 +7,19 @@ box::use( ) +box::use( + app / logic / trisk_mgmt[ + run_trisk_with_params, + format_error_message + ], + app / logic / data_load[ + load_backend_trajectories_data, + load_backend_crispy_data + ] +) + + + # Function to run the trisk model with given parameters and input path # Returns the wrangled and checked results run_trisk_with_params <- function(trisk_run_params, trisk_input_path) { @@ -35,91 +48,6 @@ run_trisk_with_params <- function(trisk_run_params, trisk_input_path) { return(st_results_wrangled_and_checked) } -# TODO MOVE TO FILE WRITE DATA -# Function to append stress test results to backend data -# It iterates over the names of the results, processes the data accordingly and appends it to the existing data -# The updated data is then written back to the file -append_st_results_to_backend_data <- function( - st_results_wrangled_and_checked, - backend_trisk_run_folder, - max_trisk_granularity) { - # Iterate over the names of the results - for (fname in names(st_results_wrangled_and_checked)) { - # Get the new data from the results - new_data <- st_results_wrangled_and_checked[[fname]] - - # Process the new data based on its name - if (fname == "crispy_output") { - new_data <- new_data |> - dplyr::mutate(company_id = as.character(company_id)) |> - stress.test.plot.report::main_load_multi_crispy_data(granularity = names(max_trisk_granularity)) - } else if (fname == "company_trajectories") { - new_data <- new_data |> - stress.test.plot.report::main_data_load_trajectories_data(granularity = names(max_trisk_granularity)) - } - - # Get the path of the file to write the data to - fpath <- fs::path(backend_trisk_run_folder, fname, ext = "parquet") - - # If the file exists, read the existing data, otherwise set the existing data to NULL - if (file.exists(fpath)) { - persistent_data <- read_parquet(fpath) - } else { - persistent_data <- NULL - } - - # Append the new data to the existing data - persistent_data <- bind_rows(persistent_data, new_data) - - # Write the updated data back to the file - write_parquet(persistent_data, fpath) - } -} - -# Function to check if a run exists based on the given trisk run parameters -# Returns the run_id if the run exists, NULL otherwise -check_if_run_exists <- function(trisk_run_params, backend_trisk_run_folder) { - # Load the backend trisk run metadata - backend_trisk_run_metadata <- load_backend_trisk_run_metadata(backend_trisk_run_folder) - - # Filter the metadata based on the provided trisk run parameters - df <- backend_trisk_run_metadata - for (trisk_param in names(trisk_run_params)) { - df <- df |> dplyr::filter(!!rlang::sym(trisk_param) == trisk_run_params[[trisk_param]]) - } - - # If a single run is found, return its run_id, otherwise return NULL or throw an error - if (nrow(df) == 1) { - run_id <- df |> dplyr::pull(run_id) - } else if (nrow(df) == 0) { - run_id <- NULL - } else { - stop("More than 1 run have been found with the provided trisk input parameters") - } - - # Return the run_id - return(run_id) -} - -# Function to get run data from a given run_id -# Returns a list containing the crispy_output and company_trajectories data filtered by the run_id -get_run_data_from_run_id <- function(run_id, backend_trisk_run_folder) { - # Load the crispy_output and company_trajectories data - crispy_output <- load_backend_crispy_data(backend_trisk_run_folder) - company_trajectories <- load_backend_trajectories_data(backend_trisk_run_folder) - - # Filter the data based on the provided run_id - crispy_output <- crispy_output |> dplyr::filter(run_id == run_id) - company_trajectories <- company_trajectories |> dplyr::filter(run_id == run_id) - - # Return the filtered data - return(list( - "crispy_output" = crispy_output, - "company_trajectories" = company_trajectories - )) -} - - # function used to debug trisk_generator() , in the terminal. # It will display a copy/pastable error message with the parameters that caused the error diff --git a/app/view/crispy_equities.R b/app/view/crispy_equities.R index 773af64..7799340 100644 --- a/app/view/crispy_equities.R +++ b/app/view/crispy_equities.R @@ -8,7 +8,7 @@ box::use( ) box::use( - app / view / modules / trisk_mgmt, + app / view / modules / trisk_button, app / view / portfolio / portfolio_analysis, app / view / modules / plots_equity_change, app / view / modules / plots_trajectories, @@ -26,7 +26,7 @@ ui <- function(id, max_trisk_granularity, available_vars) { class = "ui segment", style = "min-height: 100vh;", shiny::tags$div( class = "ui stackable grid", - trisk_mgmt$ui(ns("trisk_mgmt")), + trisk_button$ui(ns("trisk_button")), portfolio_analysis$ui(ns("portfolio_analysis"), title = "Equities portfolio"), plots_equity_change$ui(ns("plots_equity_change")), plots_trajectories$ui(ns("plots_trajectories")) @@ -53,8 +53,8 @@ server <- function(id, perimeter, backend_trisk_run_folder, trisk_input_path, ma editable_columns_names_equities <- c("exposure_value_usd") colored_columns_names_equities <- c("crispy_perc_value_change", "crispy_value_loss") - results <- trisk_mgmt$server( - "trisk_mgmt", + results <- trisk_button$server( + "trisk_button", crispy_data_r = crispy_data_r, trisk_granularity_r = trisk_granularity_r, trisk_run_params_r = trisk_run_params_r, diff --git a/app/view/crispy_loans.R b/app/view/crispy_loans.R index ec31136..f99131d 100644 --- a/app/view/crispy_loans.R +++ b/app/view/crispy_loans.R @@ -7,7 +7,7 @@ box::use( ) box::use( - app / view / modules / trisk_mgmt, + app / view / modules / trisk_button, app / view / portfolio / portfolio_analysis ) @@ -22,7 +22,7 @@ ui <- function(id, max_trisk_granularity, available_vars) { class = "pusher container", style = "min-height: 100vh;", shiny::div( class = "ui segment", style = "min-height: 100vh;", - trisk_mgmt$ui(ns("trisk_mgmt")), + trisk_button$ui(ns("trisk_button")), portfolio_analysis$ui(ns("portfolio_analysis"), "Loans Portfolio") ) ) @@ -36,8 +36,8 @@ server <- function(id, perimeter, backend_trisk_run_folder, trisk_input_path, po trisk_granularity_r <- perimeter$trisk_granularity_r trisk_run_params_r <- perimeter$trisk_run_params_r - results <- trisk_mgmt$server( - "trisk_mgmt", + results <- trisk_button$server( + "trisk_button", crispy_data_r = crispy_data_r, trisk_granularity_r = trisk_granularity_r, trisk_run_params_r = trisk_run_params_r, @@ -77,3 +77,23 @@ server <- function(id, perimeter, backend_trisk_run_folder, trisk_input_path, po ) }) } + + + + +render_portfolio <- function(output, table_to_display) { + output$portfolio_table <- renderDT( + { + datatable(table_to_display, + editable = TRUE, + options = list( + lengthChange = FALSE, # Remove "Show XXX entries" option + paging = FALSE, # Remove pagination + searching = FALSE, # Remove search input + info = FALSE # Remove "Showing N of X entries" + ) + ) + }, + server = FALSE + ) +} diff --git a/app/view/modules/trisk_mgmt.R b/app/view/modules/trisk_button.R similarity index 53% rename from app/view/modules/trisk_mgmt.R rename to app/view/modules/trisk_button.R index f4745f7..9167625 100644 --- a/app/view/modules/trisk_mgmt.R +++ b/app/view/modules/trisk_button.R @@ -7,16 +7,8 @@ box::use( ) box::use( - app / logic / trisk_mgmt[ - run_trisk_with_params, - append_st_results_to_backend_data, - check_if_run_exists, - get_run_data_from_run_id, - format_error_message - ], - app / logic / data_load[ - load_backend_trajectories_data, - load_backend_crispy_data + app / logic / trisk_button_logic[ + trisk_generator ] ) @@ -67,6 +59,7 @@ server <- function( # fetch or compute trisk on button click shiny::observeEvent(input$run_trisk, ignoreNULL = T, { + # open the model dialog shinyjs::runjs( paste0( "$('#", session$ns("mymodal"), "').modal({closable: true}).modal('show');" @@ -76,15 +69,27 @@ server <- function( if (!is.null(trisk_run_params_r())) { trisk_run_params <- shiny::reactiveValuesToList(trisk_run_params_r()) - run_id <- get_run_id( - ns = session$ns, - trisk_run_params = trisk_run_params, - backend_trisk_run_folder = backend_trisk_run_folder, - trisk_input_path = trisk_input_path, - max_trisk_granularity = max_trisk_granularity - ) + + all_input_params_initialized <- !any(sapply(trisk_run_params, function(x) { + is.null(x) + })) + if (all_input_params_initialized) { + # hardcoded market passthrough value for no carbon tax price model + if (trisk_run_params$carbon_price_model == "no_carbon_tax") { + trisk_run_params$market_passthrough <- 0 + } + + # get run_id either by running locally, or by fetching from backend + run_id <- trisk_generator( + backend_trisk_run_folder = backend_trisk_run_folder, + trisk_input_path = trisk_input_path, + trisk_run_params = trisk_run_params, + max_trisk_granularity = max_trisk_granularity + ) + } } + # close the modal dialog shinyjs::runjs( paste0( "$('#", session$ns("mymodal"), "').modal('hide');" @@ -93,7 +98,7 @@ server <- function( run_id_r(run_id) }) - # load trisk outputs + # load trisk outputs either from local storage, or cloud backend trisk_outputs <- fetch_crispy_and_trajectories_data( backend_trisk_run_folder = backend_trisk_run_folder, run_id_r = run_id_r, @@ -114,82 +119,6 @@ server <- function( } - - - - -# Function to collect run parameters from the UI, -# and then generate or fetch a trisk run -get_run_id <- function(ns, trisk_run_params, - backend_trisk_run_folder, - trisk_input_path, - max_trisk_granularity) { - all_input_params_initialized <- !any(sapply(trisk_run_params, function(x) { - is.null(x) - })) - if (all_input_params_initialized) { - # hardcoded market passthrough value for no carbon tax price model - if (trisk_run_params$carbon_price_model == "no_carbon_tax") { - trisk_run_params$market_passthrough <- 0 - } - - run_id <- trisk_generator( - ns = ns, - backend_trisk_run_folder = backend_trisk_run_folder, - trisk_input_path = trisk_input_path, - trisk_run_params = trisk_run_params, - max_trisk_granularity = max_trisk_granularity - ) - } else { - run_id <- NULL - } - return(run_id) -} - -# fetch or create a trisk run -trisk_generator <- function( - ns, - backend_trisk_run_folder, - trisk_input_path, - trisk_run_params, - max_trisk_granularity) { - run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) - - if (is.null(run_id)) { - # shinyjs::runjs("$('#mymodal').modal({closable: false}).modal('show');") - st_results_wrangled_and_checked <- tryCatch( - { - run_trisk_with_params( - trisk_run_params, - trisk_input_path - ) - }, - error = function(e) { - print(e$message) - print("\n\n") - format_error_message(trisk_run_params) - NULL - } - ) - - if (!is.null(st_results_wrangled_and_checked)) { - # Close the modal dialog and re-enable UI - append_st_results_to_backend_data( - st_results_wrangled_and_checked, - backend_trisk_run_folder, - max_trisk_granularity - ) - } - # shinyjs::runjs("$('#mymodal').modal('hide');") - } - - run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) - - return(run_id) -} - - - fetch_crispy_and_trajectories_data <- function(backend_trisk_run_folder, run_id_r, trisk_granularity_r) { @@ -202,14 +131,12 @@ fetch_crispy_and_trajectories_data <- function(backend_trisk_run_folder, observeEvent(c(run_id_r(), trisk_granularity_r()), ignoreInit = TRUE, { if (!is.null(run_id_r())) { crispy_data_r( - load_backend_crispy_data(backend_trisk_run_folder) |> - dplyr::filter(.data$run_id == run_id_r()) |> + load_backend_crispy_data(backend_trisk_run_folder, run_id == run_id_r()) |> stress.test.plot.report::main_load_multi_crispy_data(granularity = trisk_granularity_r()) ) trajectories_data_r( - load_backend_trajectories_data(backend_trisk_run_folder) |> - dplyr::filter(.data$run_id == run_id_r()) |> + load_backend_trajectories_data(backend_trisk_run_folder, run_id == run_id_r()) |> stress.test.plot.report::main_data_load_trajectories_data(granularity = trisk_granularity_r()) ) } diff --git a/scripts/install_py_env.R b/scripts/install_py_env.R index a224b19..38cf6c8 100644 --- a/scripts/install_py_env.R +++ b/scripts/install_py_env.R @@ -1,3 +1,5 @@ +## Deprecated // For reference, how to navigate python versions in reticulate + library(reticulate) python_version <- Sys.getenv("CRISPY_LOAN_PYTHON_VERSION") diff --git a/scripts/python/__init__.py b/scripts/python/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/python/fuzzy_match.py b/scripts/python/fuzzy_match.py deleted file mode 100644 index 2fc3f9a..0000000 --- a/scripts/python/fuzzy_match.py +++ /dev/null @@ -1,7 +0,0 @@ -from typing import List -from fuzzywuzzy import process - -def top_five_matches(query: str, choices: List[str]): - top_matches = process.extract(query, choices, limit=5) - return top_matches - diff --git a/scripts/trisk_k8s_api/.Rprofile b/scripts/trisk_k8s_api/.Rprofile new file mode 100644 index 0000000..81b960f --- /dev/null +++ b/scripts/trisk_k8s_api/.Rprofile @@ -0,0 +1 @@ +source("renv/activate.R") diff --git a/scripts/trisk_k8s_api/Dockerfile b/scripts/trisk_k8s_api/Dockerfile new file mode 100644 index 0000000..7932ce8 --- /dev/null +++ b/scripts/trisk_k8s_api/Dockerfile @@ -0,0 +1,58 @@ +FROM rocker/r-ver:4.3.0 + +RUN apt-get update && apt-get install -y --no-install-recommends \ + # Install system dependencies required by some R packages and renv + libcurl4-gnutls-dev \ + libssl-dev \ + libxml2-dev \ + liblzma-dev \ + libbz2-dev \ + libpcre2-dev \ + libpq-dev \ + # Python installation + python3.11 \ + python3-pip \ + python3-setuptools \ + python3-dev + +# Install Poetry for Python dependency management +# RUN pip3 install poetry + +# Set the working directory in the container +WORKDIR /app + +# Initialize the R environment with renv and restore dependencies +# Ensure your project includes an renv.lock file +# Install R dependencies +COPY .Rprofile renv.lock ./ +COPY renv/activate.R renv/ +RUN Rscript -e 'renv::restore(clean = TRUE)' + + +# Copy the Python project files and install Python dependencies +# COPY pyproject.toml poetry.lock* /app/ +# RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi + +RUN pip3 install --upgrade pip setuptools wheel +RUN pip3 install fastapi uvicorn pydantic psycopg2 +RUN pip3 install rpy2 + + +# Copy the R project files +COPY ./main.py /app/main.py +COPY ./trisk_compute.R /app/trisk_compute.R +COPY ./st_inputs/* /app/st_inputs/ + +ENV ST_POSTGRES_DB=NULL +ENV ST_POSTGRES_USER=NULL +ENV ST_POSTGRES_PASSWORD=NULL +ENV ST_POSTGRES_HOST=NULL +ENV ST_POSTGRES_PORT=NULL + + +# Expose the port your app runs on +EXPOSE 8000 + + +# Command to run the app +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/scripts/trisk_k8s_api/main.py b/scripts/trisk_k8s_api/main.py new file mode 100644 index 0000000..ae96c4f --- /dev/null +++ b/scripts/trisk_k8s_api/main.py @@ -0,0 +1,35 @@ +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +import rpy2.robjects as robjects +from rpy2.robjects.vectors import ListVector +from typing import Dict, Union + +TRISK_INPUT_PATH = './st_inputs' + +app = FastAPI() + + +# Define your Pydantic model to validate incoming data +class RParams(BaseModel): + trisk_run_params: Dict[str, Union[str, float]] # TODO expand in detailed params + +@app.post("/compute_trisk/") +async def compute_r_function(params: RParams): + try: + # Load your R script or directly use the R function + r_source = robjects.r['source'] + r_source('./trisk_compute.R') + r_run_trisk_and_upload_results = robjects.globalenv['run_trisk_and_upload_results'] + # robjects.r('options(error = function(e) { print(e); cat("Call: ", deparse(e$call), "\\n"); traceback() })') + + # Call your R function with parameters from the request + run_id = r_run_trisk_and_upload_results( + trisk_run_params=ListVector(params.trisk_run_params), + trisk_input_path=TRISK_INPUT_PATH + ) + + return {"trisk_run_id": run_id[0]} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + \ No newline at end of file diff --git a/scripts/trisk_k8s_api/readme.md b/scripts/trisk_k8s_api/readme.md new file mode 100644 index 0000000..d919096 --- /dev/null +++ b/scripts/trisk_k8s_api/readme.md @@ -0,0 +1,57 @@ +# TEST LOCALLY + +docker build -t registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest . + +docker run \ + -e ST_POSTGRES_USERNAME=$ST_POSTGRES_USERNAME \ + -e ST_POSTGRES_PASSWORD=$ST_POSTGRES_PASSWORD \ + -e ST_POSTGRES_HOST=$ST_POSTGRES_HOST \ + -e ST_POSTGRES_PORT=$ST_POSTGRES_PORT \ + -e ST_POSTGRES_DB=$ST_POSTGRES_DB \ + -p 8000:8000 registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest + + + +curl -X 'POST' \ + 'http://0.0.0.0:8000/compute_trisk/' \ + -H 'Content-Type: application/json' \ + -d '{ + "trisk_run_params": { + "baseline_scenario": "WEO2021_APS", + "shock_scenario": "WEO2021_SDS", + "scenario_geography": "Global", + "shock_year": 2025, + "discount_rate": 0.02, + "risk_free_rate": 0.01, + "growth_rate": 0.01, + "div_netprofit_prop_coef": 0.8, + "carbon_price_model": "no_carbon_tax", + "market_passthrough": 0 + } + }' + +# DEPLOY + +docker push + +## kubectl commands + +kubectl get pods + + +kubectl logs + + +kubectl apply -f app-deployment.yaml +kubectl apply -f app-service.yaml + + +kubectl get svc +kubectl get deployment + + +kubectl rollout restart deployment + +kubectl delete deployment + + diff --git a/scripts/trisk_k8s_api/renv.lock b/scripts/trisk_k8s_api/renv.lock new file mode 100644 index 0000000..c4c6483 --- /dev/null +++ b/scripts/trisk_k8s_api/renv.lock @@ -0,0 +1,921 @@ +{ + "R": { + "Version": "4.3.0", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cloud.r-project.org" + } + ] + }, + "Packages": { + "DBI": { + "Package": "DBI", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "9b4993e98e0e19da84c168460c032fef" + }, + "MASS": { + "Package": "MASS", + "Version": "7.3-58.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats", + "utils" + ], + "Hash": "a3142b2a022b8174ca675bc8b80cdc4e" + }, + "Matrix": { + "Package": "Matrix", + "Version": "1.6-1.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "lattice", + "methods", + "stats", + "utils" + ], + "Hash": "1a00d4828f33a9d690806e98bd17150c" + }, + "R6": { + "Package": "R6", + "Version": "2.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "470851b6d5d0ac559e9d01bb352b4021" + }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "45f0398006e83a5b10b72a90663d8d8c" + }, + "RPostgres": { + "Package": "RPostgres", + "Version": "1.4.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DBI", + "R", + "bit64", + "blob", + "cpp11", + "hms", + "lubridate", + "methods", + "plogr", + "withr" + ], + "Hash": "a3ccabc3de4657c14185c91f3e6d4b60" + }, + "STDataMGMT": { + "Package": "STDataMGMT", + "Version": "0.0.0.9000", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteUsername": "2DegreesInvesting", + "RemoteRepo": "STDataMGMT", + "RemoteRef": "master", + "RemoteSha": "d7ed2bd9b6e2debd72fac94f40879a44f5f72793", + "Requirements": [ + "R", + "assertr", + "countrycode", + "crayon", + "dplyr", + "fastDummies", + "fs", + "glue", + "magrittr", + "purrr", + "readr", + "readxl", + "rlang", + "stringr", + "tibble", + "tidyr", + "zoo" + ], + "Hash": "ab6b764d48b2cf632c7c94604b96d0cf" + }, + "assertr": { + "Package": "assertr", + "Version": "3.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "R", + "dplyr", + "methods", + "rlang", + "stats", + "utils" + ], + "Hash": "dd34511e88d11c95e80f8d9bb0606e79" + }, + "bit": { + "Package": "bit", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "d242abec29412ce988848d0294b208fd" + }, + "bit64": { + "Package": "bit64", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit", + "methods", + "stats", + "utils" + ], + "Hash": "9fe98599ca456d6552421db0d6772d8f" + }, + "blob": { + "Package": "blob", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods", + "rlang", + "vctrs" + ], + "Hash": "40415719b5a479b87949f3aa0aee737c" + }, + "cellranger": { + "Package": "cellranger", + "Version": "1.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rematch", + "tibble" + ], + "Hash": "f61dbaec772ccd2e17705c1e872e9e7c" + }, + "cli": { + "Package": "cli", + "Version": "3.6.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" + }, + "clipr": { + "Package": "clipr", + "Version": "0.8.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" + }, + "colorspace": { + "Package": "colorspace", + "Version": "2.1-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats" + ], + "Hash": "f20c47fd52fae58b4e377c37bb8c335b" + }, + "countrycode": { + "Package": "countrycode", + "Version": "1.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "bbc5ab5258e5ddf38f2cd2c5a7afa860" + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.4.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "5a295d7d963cc5035284dcdbaf334f4e" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "methods", + "utils" + ], + "Hash": "e8a1e41acf02548751f45c718d55aa6a" + }, + "data.table": { + "Package": "data.table", + "Version": "1.15.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "cfbbb4aed6e78cd45f17123a9ec9981a" + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "generics", + "glue", + "lifecycle", + "magrittr", + "methods", + "pillar", + "rlang", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" + }, + "fansi": { + "Package": "fansi", + "Version": "1.0.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "utils" + ], + "Hash": "962174cf2aeb5b9eea581522286a911f" + }, + "farver": { + "Package": "farver", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8106d78941f34855c440ddb946b8f7a5" + }, + "fastDummies": { + "Package": "fastDummies", + "Version": "1.7.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "data.table", + "stringr", + "tibble" + ], + "Hash": "e0f9c0c051e0e8d89996d7f0c400539f" + }, + "fs": { + "Package": "fs", + "Version": "1.6.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "47b5f30c720c23999b913a1a635cf0bb" + }, + "generics": { + "Package": "generics", + "Version": "0.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "15e9634c0fcd294799e9b2e929ed1b86" + }, + "ggplot2": { + "Package": "ggplot2", + "Version": "3.4.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "R", + "cli", + "glue", + "grDevices", + "grid", + "gtable", + "isoband", + "lifecycle", + "mgcv", + "rlang", + "scales", + "stats", + "tibble", + "vctrs", + "withr" + ], + "Hash": "313d31eff2274ecf4c1d3581db7241f9" + }, + "glue": { + "Package": "glue", + "Version": "1.7.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "e0b3a53876554bd45879e596cdb10a52" + }, + "gtable": { + "Package": "gtable", + "Version": "0.3.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "grid", + "lifecycle", + "rlang" + ], + "Hash": "b29cf3031f49b04ab9c852c912547eef" + }, + "hms": { + "Package": "hms", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "lifecycle", + "methods", + "pkgconfig", + "rlang", + "vctrs" + ], + "Hash": "b59377caa7ed00fa41808342002138f9" + }, + "isoband": { + "Package": "isoband", + "Version": "0.2.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grid", + "utils" + ], + "Hash": "0080607b4a1a7b28979aecef976d8bc2" + }, + "labeling": { + "Package": "labeling", + "Version": "0.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "graphics", + "stats" + ], + "Hash": "b64ec208ac5bc1852b285f665d6368b3" + }, + "lattice": { + "Package": "lattice", + "Version": "0.21-8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "stats", + "utils" + ], + "Hash": "0b8a6d63c8770f02a8b5635f3c431e6b" + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "rlang" + ], + "Hash": "b8552d117e1b808b09a832f589b79035" + }, + "lubridate": { + "Package": "lubridate", + "Version": "1.9.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "generics", + "methods", + "timechange" + ], + "Hash": "680ad542fbcf801442c83a6ac5a2126c" + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "7ce2733a9826b3aeb1775d56fd305472" + }, + "mgcv": { + "Package": "mgcv", + "Version": "1.8-42", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "graphics", + "methods", + "nlme", + "splines", + "stats", + "utils" + ], + "Hash": "3460beba7ccc8946249ba35327ba902a" + }, + "munsell": { + "Package": "munsell", + "Version": "0.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "colorspace", + "methods" + ], + "Hash": "6dfe8bf774944bd5595785e3229d8771" + }, + "nlme": { + "Package": "nlme", + "Version": "3.1-162", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "graphics", + "lattice", + "stats", + "utils" + ], + "Hash": "0984ce8da8da9ead8643c5cbbb60f83e" + }, + "pillar": { + "Package": "pillar", + "Version": "1.9.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "fansi", + "glue", + "lifecycle", + "rlang", + "utf8", + "utils", + "vctrs" + ], + "Hash": "15da5a8412f317beeee6175fbc76f4bb" + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "01f28d4278f15c76cddbea05899c5d6f" + }, + "plogr": { + "Package": "plogr", + "Version": "0.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "09eb987710984fc2905c7129c7d85e65" + }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + }, + "progress": { + "Package": "progress", + "Version": "1.2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "crayon", + "hms", + "prettyunits" + ], + "Hash": "f4625e061cb2865f111b47ff163a5ca6" + }, + "purrr": { + "Package": "purrr", + "Version": "1.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "lifecycle", + "magrittr", + "rlang", + "vctrs" + ], + "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc" + }, + "r2dii.climate.stress.test": { + "Package": "r2dii.climate.stress.test", + "Version": "0.0.0.9005", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteUsername": "2DegreesInvesting", + "RemoteRepo": "r2dii.climate.stress.test", + "RemoteRef": "master", + "RemoteSha": "1497dbec053388c525ead3f4fb0e9a927e85f589", + "Remotes": "github::2DegreesInvesting/STDataMGMT", + "Requirements": [ + "R", + "STDataMGMT", + "dplyr", + "fs", + "ggplot2", + "glue", + "magrittr", + "purrr", + "readr", + "rlang", + "tibble", + "tidyr", + "uuid", + "withr", + "zoo" + ], + "Hash": "890fb717d2d9df6b9c31bec0c60fef2c" + }, + "readr": { + "Package": "readr", + "Version": "2.1.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "clipr", + "cpp11", + "crayon", + "hms", + "lifecycle", + "methods", + "rlang", + "tibble", + "tzdb", + "utils", + "vroom" + ], + "Hash": "9de96463d2117f6ac49980577939dfb3" + }, + "readxl": { + "Package": "readxl", + "Version": "1.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cellranger", + "cpp11", + "progress", + "tibble", + "utils" + ], + "Hash": "8cf9c239b96df1bbb133b74aef77ad0a" + }, + "rematch": { + "Package": "rematch", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "cbff1b666c6fa6d21202f07e2318d4f1" + }, + "renv": { + "Package": "renv", + "Version": "0.17.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "4543b8cd233ae25c6aba8548be9e747e" + }, + "rlang": { + "Package": "rlang", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" + }, + "scales": { + "Package": "scales", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "RColorBrewer", + "cli", + "farver", + "glue", + "labeling", + "lifecycle", + "munsell", + "rlang", + "viridisLite" + ], + "Hash": "c19df082ba346b0ffa6f833e92de34d1" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats", + "tools", + "utils" + ], + "Hash": "058aebddea264f4c99401515182e656a" + }, + "stringr": { + "Package": "stringr", + "Version": "1.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "magrittr", + "rlang", + "stringi", + "vctrs" + ], + "Hash": "960e2ae9e09656611e0b8214ad543207" + }, + "tibble": { + "Package": "tibble", + "Version": "3.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "fansi", + "lifecycle", + "magrittr", + "methods", + "pillar", + "pkgconfig", + "rlang", + "utils", + "vctrs" + ], + "Hash": "a84e2cc86d07289b3b6f5069df7a004c" + }, + "tidyr": { + "Package": "tidyr", + "Version": "1.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "cpp11", + "dplyr", + "glue", + "lifecycle", + "magrittr", + "purrr", + "rlang", + "stringr", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "915fb7ce036c22a6a33b5a8adb712eb1" + }, + "tidyselect": { + "Package": "tidyselect", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang", + "vctrs", + "withr" + ], + "Hash": "79540e5fcd9e0435af547d885f184fd5" + }, + "timechange": { + "Package": "timechange", + "Version": "0.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "c5f3c201b931cd6474d17d8700ccb1c8" + }, + "tzdb": { + "Package": "tzdb", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "f561504ec2897f4d46f0c7657e488ae1" + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "62b65c52671e6665f803ff02954446e9" + }, + "uuid": { + "Package": "uuid", + "Version": "1.2-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "303c19bfd970bece872f93a824e323d9" + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.6.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang" + ], + "Hash": "c03fa420630029418f7e6da3667aac4a" + }, + "viridisLite": { + "Package": "viridisLite", + "Version": "0.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" + }, + "vroom": { + "Package": "vroom", + "Version": "1.6.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit64", + "cli", + "cpp11", + "crayon", + "glue", + "hms", + "lifecycle", + "methods", + "progress", + "rlang", + "stats", + "tibble", + "tidyselect", + "tzdb", + "vctrs", + "withr" + ], + "Hash": "390f9315bc0025be03012054103d227c" + }, + "withr": { + "Package": "withr", + "Version": "3.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics" + ], + "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + }, + "zoo": { + "Package": "zoo", + "Version": "1.8-12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "lattice", + "stats", + "utils" + ], + "Hash": "5c715954112b45499fb1dadc6ee6ee3e" + } + } +} diff --git a/scripts/trisk_k8s_api/renv/.gitignore b/scripts/trisk_k8s_api/renv/.gitignore new file mode 100644 index 0000000..0ec0cbb --- /dev/null +++ b/scripts/trisk_k8s_api/renv/.gitignore @@ -0,0 +1,7 @@ +library/ +local/ +cellar/ +lock/ +python/ +sandbox/ +staging/ diff --git a/scripts/trisk_k8s_api/renv/activate.R b/scripts/trisk_k8s_api/renv/activate.R new file mode 100644 index 0000000..a8fdc32 --- /dev/null +++ b/scripts/trisk_k8s_api/renv/activate.R @@ -0,0 +1,1032 @@ + +local({ + + # the requested version of renv + version <- "0.17.3" + + # the project directory + project <- getwd() + + # figure out whether the autoloader is enabled + enabled <- local({ + + # first, check config option + override <- getOption("renv.config.autoloader.enabled") + if (!is.null(override)) + return(override) + + # next, check environment variables + # TODO: prefer using the configuration one in the future + envvars <- c( + "RENV_CONFIG_AUTOLOADER_ENABLED", + "RENV_AUTOLOADER_ENABLED", + "RENV_ACTIVATE_PROJECT" + ) + + for (envvar in envvars) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(tolower(envval) %in% c("true", "t", "1")) + } + + # enable by default + TRUE + + }) + + if (!enabled) + return(FALSE) + + # avoid recursion + if (identical(getOption("renv.autoloader.running"), TRUE)) { + warning("ignoring recursive attempt to run renv autoloader") + return(invisible(TRUE)) + } + + # signal that we're loading renv during R startup + options(renv.autoloader.running = TRUE) + on.exit(options(renv.autoloader.running = NULL), add = TRUE) + + # signal that we've consented to use renv + options(renv.consent = TRUE) + + # load the 'utils' package eagerly -- this ensures that renv shims, which + # mask 'utils' packages, will come first on the search path + library(utils, lib.loc = .Library) + + # unload renv if it's already been loaded + if ("renv" %in% loadedNamespaces()) + unloadNamespace("renv") + + # load bootstrap tools + `%||%` <- function(x, y) { + if (is.environment(x) || length(x)) x else y + } + + `%??%` <- function(x, y) { + if (is.null(x)) y else x + } + + bootstrap <- function(version, library) { + + # attempt to download renv + tarball <- tryCatch(renv_bootstrap_download(version), error = identity) + if (inherits(tarball, "error")) + stop("failed to download renv ", version) + + # now attempt to install + status <- tryCatch(renv_bootstrap_install(version, tarball, library), error = identity) + if (inherits(status, "error")) + stop("failed to install renv ", version) + + } + + renv_bootstrap_tests_running <- function() { + getOption("renv.tests.running", default = FALSE) + } + + renv_bootstrap_repos <- function() { + + # get CRAN repository + cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") + + # check for repos override + repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) + if (!is.na(repos)) { + + # check for RSPM; if set, use a fallback repository for renv + rspm <- Sys.getenv("RSPM", unset = NA) + if (identical(rspm, repos)) + repos <- c(RSPM = rspm, CRAN = cran) + + return(repos) + + } + + # check for lockfile repositories + repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) + if (!inherits(repos, "error") && length(repos)) + return(repos) + + # if we're testing, re-use the test repositories + if (renv_bootstrap_tests_running()) { + repos <- getOption("renv.tests.repos") + if (!is.null(repos)) + return(repos) + } + + # retrieve current repos + repos <- getOption("repos") + + # ensure @CRAN@ entries are resolved + repos[repos == "@CRAN@"] <- cran + + # add in renv.bootstrap.repos if set + default <- c(FALLBACK = "https://cloud.r-project.org") + extra <- getOption("renv.bootstrap.repos", default = default) + repos <- c(repos, extra) + + # remove duplicates that might've snuck in + dupes <- duplicated(repos) | duplicated(names(repos)) + repos[!dupes] + + } + + renv_bootstrap_repos_lockfile <- function() { + + lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") + if (!file.exists(lockpath)) + return(NULL) + + lockfile <- tryCatch(renv_json_read(lockpath), error = identity) + if (inherits(lockfile, "error")) { + warning(lockfile) + return(NULL) + } + + repos <- lockfile$R$Repositories + if (length(repos) == 0) + return(NULL) + + keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) + vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) + names(vals) <- keys + + return(vals) + + } + + renv_bootstrap_download <- function(version) { + + # if the renv version number has 4 components, assume it must + # be retrieved via github + nv <- numeric_version(version) + components <- unclass(nv)[[1]] + + # if this appears to be a development version of 'renv', we'll + # try to restore from github + dev <- length(components) == 4L + + # begin collecting different methods for finding renv + methods <- c( + renv_bootstrap_download_tarball, + if (dev) + renv_bootstrap_download_github + else c( + renv_bootstrap_download_cran_latest, + renv_bootstrap_download_cran_archive + ) + ) + + for (method in methods) { + path <- tryCatch(method(version), error = identity) + if (is.character(path) && file.exists(path)) + return(path) + } + + stop("failed to download renv ", version) + + } + + renv_bootstrap_download_impl <- function(url, destfile) { + + mode <- "wb" + + # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 + fixup <- + Sys.info()[["sysname"]] == "Windows" && + substring(url, 1L, 5L) == "file:" + + if (fixup) + mode <- "w+b" + + args <- list( + url = url, + destfile = destfile, + mode = mode, + quiet = TRUE + ) + + if ("headers" %in% names(formals(utils::download.file))) + args$headers <- renv_bootstrap_download_custom_headers(url) + + do.call(utils::download.file, args) + + } + + renv_bootstrap_download_custom_headers <- function(url) { + + headers <- getOption("renv.download.headers") + if (is.null(headers)) + return(character()) + + if (!is.function(headers)) + stopf("'renv.download.headers' is not a function") + + headers <- headers(url) + if (length(headers) == 0L) + return(character()) + + if (is.list(headers)) + headers <- unlist(headers, recursive = FALSE, use.names = TRUE) + + ok <- + is.character(headers) && + is.character(names(headers)) && + all(nzchar(names(headers))) + + if (!ok) + stop("invocation of 'renv.download.headers' did not return a named character vector") + + headers + + } + + renv_bootstrap_download_cran_latest <- function(version) { + + spec <- renv_bootstrap_download_cran_latest_find(version) + type <- spec$type + repos <- spec$repos + + message("* Downloading renv ", version, " ... ", appendLF = FALSE) + + baseurl <- utils::contrib.url(repos = repos, type = type) + ext <- if (identical(type, "source")) + ".tar.gz" + else if (Sys.info()[["sysname"]] == "Windows") + ".zip" + else + ".tgz" + name <- sprintf("renv_%s%s", version, ext) + url <- paste(baseurl, name, sep = "/") + + destfile <- file.path(tempdir(), name) + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (inherits(status, "condition")) { + message("FAILED") + return(FALSE) + } + + # report success and return + message("OK (downloaded ", type, ")") + destfile + + } + + renv_bootstrap_download_cran_latest_find <- function(version) { + + # check whether binaries are supported on this system + binary <- + getOption("renv.bootstrap.binary", default = TRUE) && + !identical(.Platform$pkgType, "source") && + !identical(getOption("pkgType"), "source") && + Sys.info()[["sysname"]] %in% c("Darwin", "Windows") + + types <- c(if (binary) "binary", "source") + + # iterate over types + repositories + for (type in types) { + for (repos in renv_bootstrap_repos()) { + + # retrieve package database + db <- tryCatch( + as.data.frame( + utils::available.packages(type = type, repos = repos), + stringsAsFactors = FALSE + ), + error = identity + ) + + if (inherits(db, "error")) + next + + # check for compatible entry + entry <- db[db$Package %in% "renv" & db$Version %in% version, ] + if (nrow(entry) == 0) + next + + # found it; return spec to caller + spec <- list(entry = entry, type = type, repos = repos) + return(spec) + + } + } + + # if we got here, we failed to find renv + fmt <- "renv %s is not available from your declared package repositories" + stop(sprintf(fmt, version)) + + } + + renv_bootstrap_download_cran_archive <- function(version) { + + name <- sprintf("renv_%s.tar.gz", version) + repos <- renv_bootstrap_repos() + urls <- file.path(repos, "src/contrib/Archive/renv", name) + destfile <- file.path(tempdir(), name) + + message("* Downloading renv ", version, " ... ", appendLF = FALSE) + + for (url in urls) { + + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (identical(status, 0L)) { + message("OK") + return(destfile) + } + + } + + message("FAILED") + return(FALSE) + + } + + renv_bootstrap_download_tarball <- function(version) { + + # if the user has provided the path to a tarball via + # an environment variable, then use it + tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) + if (is.na(tarball)) + return() + + # allow directories + if (dir.exists(tarball)) { + name <- sprintf("renv_%s.tar.gz", version) + tarball <- file.path(tarball, name) + } + + # bail if it doesn't exist + if (!file.exists(tarball)) { + + # let the user know we weren't able to honour their request + fmt <- "* RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." + msg <- sprintf(fmt, tarball) + warning(msg) + + # bail + return() + + } + + fmt <- "* Bootstrapping with tarball at path '%s'." + msg <- sprintf(fmt, tarball) + message(msg) + + tarball + + } + + renv_bootstrap_download_github <- function(version) { + + enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") + if (!identical(enabled, "TRUE")) + return(FALSE) + + # prepare download options + pat <- Sys.getenv("GITHUB_PAT") + if (nzchar(Sys.which("curl")) && nzchar(pat)) { + fmt <- "--location --fail --header \"Authorization: token %s\"" + extra <- sprintf(fmt, pat) + saved <- options("download.file.method", "download.file.extra") + options(download.file.method = "curl", download.file.extra = extra) + on.exit(do.call(base::options, saved), add = TRUE) + } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { + fmt <- "--header=\"Authorization: token %s\"" + extra <- sprintf(fmt, pat) + saved <- options("download.file.method", "download.file.extra") + options(download.file.method = "wget", download.file.extra = extra) + on.exit(do.call(base::options, saved), add = TRUE) + } + + message("* Downloading renv ", version, " from GitHub ... ", appendLF = FALSE) + + url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) + name <- sprintf("renv_%s.tar.gz", version) + destfile <- file.path(tempdir(), name) + + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (!identical(status, 0L)) { + message("FAILED") + return(FALSE) + } + + message("OK") + return(destfile) + + } + + renv_bootstrap_install <- function(version, tarball, library) { + + # attempt to install it into project library + message("* Installing renv ", version, " ... ", appendLF = FALSE) + dir.create(library, showWarnings = FALSE, recursive = TRUE) + + # invoke using system2 so we can capture and report output + bin <- R.home("bin") + exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" + r <- file.path(bin, exe) + + args <- c( + "--vanilla", "CMD", "INSTALL", "--no-multiarch", + "-l", shQuote(path.expand(library)), + shQuote(path.expand(tarball)) + ) + + output <- system2(r, args, stdout = TRUE, stderr = TRUE) + message("Done!") + + # check for successful install + status <- attr(output, "status") + if (is.numeric(status) && !identical(status, 0L)) { + header <- "Error installing renv:" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- c(header, lines, output) + writeLines(text, con = stderr()) + } + + status + + } + + renv_bootstrap_platform_prefix <- function() { + + # construct version prefix + version <- paste(R.version$major, R.version$minor, sep = ".") + prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") + + # include SVN revision for development versions of R + # (to avoid sharing platform-specific artefacts with released versions of R) + devel <- + identical(R.version[["status"]], "Under development (unstable)") || + identical(R.version[["nickname"]], "Unsuffered Consequences") + + if (devel) + prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") + + # build list of path components + components <- c(prefix, R.version$platform) + + # include prefix if provided by user + prefix <- renv_bootstrap_platform_prefix_impl() + if (!is.na(prefix) && nzchar(prefix)) + components <- c(prefix, components) + + # build prefix + paste(components, collapse = "/") + + } + + renv_bootstrap_platform_prefix_impl <- function() { + + # if an explicit prefix has been supplied, use it + prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) + if (!is.na(prefix)) + return(prefix) + + # if the user has requested an automatic prefix, generate it + auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) + if (auto %in% c("TRUE", "True", "true", "1")) + return(renv_bootstrap_platform_prefix_auto()) + + # empty string on failure + "" + + } + + renv_bootstrap_platform_prefix_auto <- function() { + + prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) + if (inherits(prefix, "error") || prefix %in% "unknown") { + + msg <- paste( + "failed to infer current operating system", + "please file a bug report at https://github.com/rstudio/renv/issues", + sep = "; " + ) + + warning(msg) + + } + + prefix + + } + + renv_bootstrap_platform_os <- function() { + + sysinfo <- Sys.info() + sysname <- sysinfo[["sysname"]] + + # handle Windows + macOS up front + if (sysname == "Windows") + return("windows") + else if (sysname == "Darwin") + return("macos") + + # check for os-release files + for (file in c("/etc/os-release", "/usr/lib/os-release")) + if (file.exists(file)) + return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) + + # check for redhat-release files + if (file.exists("/etc/redhat-release")) + return(renv_bootstrap_platform_os_via_redhat_release()) + + "unknown" + + } + + renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { + + # read /etc/os-release + release <- utils::read.table( + file = file, + sep = "=", + quote = c("\"", "'"), + col.names = c("Key", "Value"), + comment.char = "#", + stringsAsFactors = FALSE + ) + + vars <- as.list(release$Value) + names(vars) <- release$Key + + # get os name + os <- tolower(sysinfo[["sysname"]]) + + # read id + id <- "unknown" + for (field in c("ID", "ID_LIKE")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + id <- vars[[field]] + break + } + } + + # read version + version <- "unknown" + for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + version <- vars[[field]] + break + } + } + + # join together + paste(c(os, id, version), collapse = "-") + + } + + renv_bootstrap_platform_os_via_redhat_release <- function() { + + # read /etc/redhat-release + contents <- readLines("/etc/redhat-release", warn = FALSE) + + # infer id + id <- if (grepl("centos", contents, ignore.case = TRUE)) + "centos" + else if (grepl("redhat", contents, ignore.case = TRUE)) + "redhat" + else + "unknown" + + # try to find a version component (very hacky) + version <- "unknown" + + parts <- strsplit(contents, "[[:space:]]")[[1L]] + for (part in parts) { + + nv <- tryCatch(numeric_version(part), error = identity) + if (inherits(nv, "error")) + next + + version <- nv[1, 1] + break + + } + + paste(c("linux", id, version), collapse = "-") + + } + + renv_bootstrap_library_root_name <- function(project) { + + # use project name as-is if requested + asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") + if (asis) + return(basename(project)) + + # otherwise, disambiguate based on project's path + id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) + paste(basename(project), id, sep = "-") + + } + + renv_bootstrap_library_root <- function(project) { + + prefix <- renv_bootstrap_profile_prefix() + + path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) + if (!is.na(path)) + return(paste(c(path, prefix), collapse = "/")) + + path <- renv_bootstrap_library_root_impl(project) + if (!is.null(path)) { + name <- renv_bootstrap_library_root_name(project) + return(paste(c(path, prefix, name), collapse = "/")) + } + + renv_bootstrap_paths_renv("library", project = project) + + } + + renv_bootstrap_library_root_impl <- function(project) { + + root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) + if (!is.na(root)) + return(root) + + type <- renv_bootstrap_project_type(project) + if (identical(type, "package")) { + userdir <- renv_bootstrap_user_dir() + return(file.path(userdir, "library")) + } + + } + + renv_bootstrap_validate_version <- function(version) { + + loadedversion <- utils::packageDescription("renv", fields = "Version") + if (version == loadedversion) + return(TRUE) + + # assume four-component versions are from GitHub; + # three-component versions are from CRAN + components <- strsplit(loadedversion, "[.-]")[[1]] + remote <- if (length(components) == 4L) + paste("rstudio/renv", loadedversion, sep = "@") + else + paste("renv", loadedversion, sep = "@") + + fmt <- paste( + "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", + "Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", + "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", + sep = "\n" + ) + + msg <- sprintf(fmt, loadedversion, version, remote) + warning(msg, call. = FALSE) + + FALSE + + } + + renv_bootstrap_hash_text <- function(text) { + + hashfile <- tempfile("renv-hash-") + on.exit(unlink(hashfile), add = TRUE) + + writeLines(text, con = hashfile) + tools::md5sum(hashfile) + + } + + renv_bootstrap_load <- function(project, libpath, version) { + + # try to load renv from the project library + if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) + return(FALSE) + + # warn if the version of renv loaded does not match + renv_bootstrap_validate_version(version) + + # execute renv load hooks, if any + hooks <- getHook("renv::autoload") + for (hook in hooks) + if (is.function(hook)) + tryCatch(hook(), error = warning) + + # load the project + renv::load(project) + + TRUE + + } + + renv_bootstrap_profile_load <- function(project) { + + # if RENV_PROFILE is already set, just use that + profile <- Sys.getenv("RENV_PROFILE", unset = NA) + if (!is.na(profile) && nzchar(profile)) + return(profile) + + # check for a profile file (nothing to do if it doesn't exist) + path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) + if (!file.exists(path)) + return(NULL) + + # read the profile, and set it if it exists + contents <- readLines(path, warn = FALSE) + if (length(contents) == 0L) + return(NULL) + + # set RENV_PROFILE + profile <- contents[[1L]] + if (!profile %in% c("", "default")) + Sys.setenv(RENV_PROFILE = profile) + + profile + + } + + renv_bootstrap_profile_prefix <- function() { + profile <- renv_bootstrap_profile_get() + if (!is.null(profile)) + return(file.path("profiles", profile, "renv")) + } + + renv_bootstrap_profile_get <- function() { + profile <- Sys.getenv("RENV_PROFILE", unset = "") + renv_bootstrap_profile_normalize(profile) + } + + renv_bootstrap_profile_set <- function(profile) { + profile <- renv_bootstrap_profile_normalize(profile) + if (is.null(profile)) + Sys.unsetenv("RENV_PROFILE") + else + Sys.setenv(RENV_PROFILE = profile) + } + + renv_bootstrap_profile_normalize <- function(profile) { + + if (is.null(profile) || profile %in% c("", "default")) + return(NULL) + + profile + + } + + renv_bootstrap_path_absolute <- function(path) { + + substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( + substr(path, 1L, 1L) %in% c(letters, LETTERS) && + substr(path, 2L, 3L) %in% c(":/", ":\\") + ) + + } + + renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { + renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") + root <- if (renv_bootstrap_path_absolute(renv)) NULL else project + prefix <- if (profile) renv_bootstrap_profile_prefix() + components <- c(root, renv, prefix, ...) + paste(components, collapse = "/") + } + + renv_bootstrap_project_type <- function(path) { + + descpath <- file.path(path, "DESCRIPTION") + if (!file.exists(descpath)) + return("unknown") + + desc <- tryCatch( + read.dcf(descpath, all = TRUE), + error = identity + ) + + if (inherits(desc, "error")) + return("unknown") + + type <- desc$Type + if (!is.null(type)) + return(tolower(type)) + + package <- desc$Package + if (!is.null(package)) + return("package") + + "unknown" + + } + + renv_bootstrap_user_dir <- function() { + dir <- renv_bootstrap_user_dir_impl() + path.expand(chartr("\\", "/", dir)) + } + + renv_bootstrap_user_dir_impl <- function() { + + # use local override if set + override <- getOption("renv.userdir.override") + if (!is.null(override)) + return(override) + + # use R_user_dir if available + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) + return(tools$R_user_dir("renv", "cache")) + + # try using our own backfill for older versions of R + envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") + for (envvar in envvars) { + root <- Sys.getenv(envvar, unset = NA) + if (!is.na(root)) + return(file.path(root, "R/renv")) + } + + # use platform-specific default fallbacks + if (Sys.info()[["sysname"]] == "Windows") + file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") + else if (Sys.info()[["sysname"]] == "Darwin") + "~/Library/Caches/org.R-project.R/R/renv" + else + "~/.cache/R/renv" + + } + + + renv_json_read <- function(file = NULL, text = NULL) { + + jlerr <- NULL + + # if jsonlite is loaded, use that instead + if ("jsonlite" %in% loadedNamespaces()) { + + json <- catch(renv_json_read_jsonlite(file, text)) + if (!inherits(json, "error")) + return(json) + + jlerr <- json + + } + + # otherwise, fall back to the default JSON reader + json <- catch(renv_json_read_default(file, text)) + if (!inherits(json, "error")) + return(json) + + # report an error + if (!is.null(jlerr)) + stop(jlerr) + else + stop(json) + + } + + renv_json_read_jsonlite <- function(file = NULL, text = NULL) { + text <- paste(text %||% read(file), collapse = "\n") + jsonlite::fromJSON(txt = text, simplifyVector = FALSE) + } + + renv_json_read_default <- function(file = NULL, text = NULL) { + + # find strings in the JSON + text <- paste(text %||% read(file), collapse = "\n") + pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + locs <- gregexpr(pattern, text, perl = TRUE)[[1]] + + # if any are found, replace them with placeholders + replaced <- text + strings <- character() + replacements <- character() + + if (!identical(c(locs), -1L)) { + + # get the string values + starts <- locs + ends <- locs + attr(locs, "match.length") - 1L + strings <- substring(text, starts, ends) + + # only keep those requiring escaping + strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) + + # compute replacements + replacements <- sprintf('"\032%i\032"', seq_along(strings)) + + # replace the strings + mapply(function(string, replacement) { + replaced <<- sub(string, replacement, replaced, fixed = TRUE) + }, strings, replacements) + + } + + # transform the JSON into something the R parser understands + transformed <- replaced + transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE) + transformed <- gsub("[[{]", "list(", transformed, perl = TRUE) + transformed <- gsub("[]}]", ")", transformed, perl = TRUE) + transformed <- gsub(":", "=", transformed, fixed = TRUE) + text <- paste(transformed, collapse = "\n") + + # parse it + json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] + + # construct map between source strings, replaced strings + map <- as.character(parse(text = strings)) + names(map) <- as.character(parse(text = replacements)) + + # convert to list + map <- as.list(map) + + # remap strings in object + remapped <- renv_json_remap(json, map) + + # evaluate + eval(remapped, envir = baseenv()) + + } + + renv_json_remap <- function(json, map) { + + # fix names + if (!is.null(names(json))) { + lhs <- match(names(json), names(map), nomatch = 0L) + rhs <- match(names(map), names(json), nomatch = 0L) + names(json)[rhs] <- map[lhs] + } + + # fix values + if (is.character(json)) + return(map[[json]] %||% json) + + # handle true, false, null + if (is.name(json)) { + text <- as.character(json) + if (text == "true") + return(TRUE) + else if (text == "false") + return(FALSE) + else if (text == "null") + return(NULL) + } + + # recurse + if (is.recursive(json)) { + for (i in seq_along(json)) { + json[i] <- list(renv_json_remap(json[[i]], map)) + } + } + + json + + } + + # load the renv profile, if any + renv_bootstrap_profile_load(project) + + # construct path to library root + root <- renv_bootstrap_library_root(project) + + # construct library prefix for platform + prefix <- renv_bootstrap_platform_prefix() + + # construct full libpath + libpath <- file.path(root, prefix) + + # attempt to load + if (renv_bootstrap_load(project, libpath, version)) + return(TRUE) + + # load failed; inform user we're about to bootstrap + prefix <- paste("# Bootstrapping renv", version) + postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "") + header <- paste(prefix, postfix) + message(header) + + # perform bootstrap + bootstrap(version, libpath) + + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + return(TRUE) + + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + message("* Successfully installed and loaded renv ", version, ".") + return(renv::load()) + } + + # failed to download or load renv; warn the user + msg <- c( + "Failed to find an renv installation: the project will not be loaded.", + "Use `renv::activate()` to re-initialize the project." + ) + + warning(paste(msg, collapse = "\n"), call. = FALSE) + +}) diff --git a/scripts/trisk_k8s_api/trisk_compute.R b/scripts/trisk_k8s_api/trisk_compute.R new file mode 100644 index 0000000..b7601d3 --- /dev/null +++ b/scripts/trisk_k8s_api/trisk_compute.R @@ -0,0 +1,101 @@ +run_trisk_and_upload_results <- function( + trisk_run_params, + trisk_input_path) { + + dbname <- Sys.getenv("ST_POSTGRES_DB") + host_db <- Sys.getenv("ST_POSTGRES_HOST") + db_port <- Sys.getenv("ST_POSTGRES_PORT") + db_user <- Sys.getenv("ST_POSTGRES_USERNAME") + db_password <- Sys.getenv("ST_POSTGRES_PASSWORD") + + + trisk_run_params <- as.list(trisk_run_params) + trisk_input_path <- as.character(trisk_input_path) + + st_results_wrangled_and_checked <- run_trisk_with_params( + trisk_run_params = trisk_run_params, + trisk_input_path = trisk_input_path + ) + if (!is.null(st_results_wrangled_and_checked)) { + run_id <- upload_to_postgres( + st_results_wrangled_and_checked = st_results_wrangled_and_checked, + dbname = dbname, + host_db = host_db, + db_port = db_port, + db_user = db_user, + db_password = db_password + ) + run_id <- unique(st_results_wrangled_and_checked$run_metadata$run_id) + } else { + run_id <- NULL + } + + return(run_id) +} + + + +# Function to run the trisk model with given parameters and input path +# Returns the wrangled and checked results +run_trisk_with_params <- function(trisk_run_params, trisk_input_path) { + tryCatch( + { + # Run the trisk model with the provided parameters and input path + # The results are returned and stored in st_results_wrangled_and_checked + st_results_wrangled_and_checked <- do.call( + r2dii.climate.stress.test::run_trisk, + c( + trisk_run_params, + list( + input_path = trisk_input_path, + output_path = tempdir(), + return_results = TRUE + ) + ) + ) + + # Extract the run metadata from the crispy_output + run_metadata <- dplyr::distinct_at( + st_results_wrangled_and_checked$crispy_output, + c(names(trisk_run_params), "run_id") + ) + + # Add the run metadata to the results + st_results_wrangled_and_checked$run_metadata <- run_metadata + }, + error = function(e) { + # This block will run if there's an error in the try block + + # Print the error message + print(e$message) + + # Print the last error and trace using rlang + print(rlang::last_error()) + print(rlang::last_trace()) + + stop("Error running TRISK") + } + ) + + # Return the results + return(st_results_wrangled_and_checked) +} + + + +upload_to_postgres <- function(st_results_wrangled_and_checked, dbname, host_db, db_port, db_user, db_password) { + conn <- DBI::dbConnect(RPostgres::Postgres(), dbname = dbname, host = host_db, port = db_port, user = db_user, password = db_password) + + # Iterate over the names of the results + for (st_output_name in names(st_results_wrangled_and_checked)) { + # Get the new data from the results + st_output_df <- st_results_wrangled_and_checked[[st_output_name]] + if (DBI::dbExistsTable(conn, st_output_name)) { + DBI::dbAppendTable(conn, st_output_name, st_output_df) + } else { + DBI::dbCreateTable(conn, st_output_name, st_output_df) + } + } + DBI::dbDisconnect(conn) +} + From 0e9fbe3f443ee405bedd1bf49ab7426e9458d9a4 Mon Sep 17 00:00:00 2001 From: bertrand Date: Thu, 15 Feb 2024 21:48:31 +0100 Subject: [PATCH 02/15] k8s configs --- .gitignore | 1 + scripts/trisk_k8s_api/app-deployment.yaml | 34 +++++++++++++++++++++++ scripts/trisk_k8s_api/app-service.yaml | 12 ++++++++ scripts/trisk_k8s_api/db-credentials.yaml | 8 ++++++ 4 files changed, 55 insertions(+) create mode 100644 scripts/trisk_k8s_api/app-deployment.yaml create mode 100644 scripts/trisk_k8s_api/app-service.yaml create mode 100644 scripts/trisk_k8s_api/db-credentials.yaml diff --git a/.gitignore b/.gitignore index 3af5a60..8a60057 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ node_modules/ package.json cypress.config.js package-lock.json +scripts/trisk_k8s_api/st_inputs/* diff --git a/scripts/trisk_k8s_api/app-deployment.yaml b/scripts/trisk_k8s_api/app-deployment.yaml new file mode 100644 index 0000000..494eeb7 --- /dev/null +++ b/scripts/trisk_k8s_api/app-deployment.yaml @@ -0,0 +1,34 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: trisk-api +spec: + replicas: 2 # Start with 2 replicas; adjust as necessary + selector: + matchLabels: + app: trisk-api + template: + metadata: + labels: + app: trisk-api + spec: + containers: + - name: trisk-api + image: registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest # Replace with your actual image path + imagePullPolicy: Always + ports: + - containerPort: 8000 + env: + - name: ST_POSTGRES_USERNAME + value: "doadmin" + - name: ST_POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: db-credentials + key: postgres_password + - name: ST_POSTGRES_HOST + value: "db-postgresql-st-inputs-do-user-15367886-0.c.db.ondigitalocean.com" + - name: ST_POSTGRES_PORT + value: "25060" + - name: ST_POSTGRES_DB + value: "defaultdb" diff --git a/scripts/trisk_k8s_api/app-service.yaml b/scripts/trisk_k8s_api/app-service.yaml new file mode 100644 index 0000000..9cf4ba0 --- /dev/null +++ b/scripts/trisk_k8s_api/app-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: trisk-api-service +spec: + type: LoadBalancer + selector: + app: trisk-api + ports: + - protocol: TCP + port: 80 + targetPort: 8000 diff --git a/scripts/trisk_k8s_api/db-credentials.yaml b/scripts/trisk_k8s_api/db-credentials.yaml new file mode 100644 index 0000000..537d292 --- /dev/null +++ b/scripts/trisk_k8s_api/db-credentials.yaml @@ -0,0 +1,8 @@ +# db-credentials.yaml +apiVersion: v1 +kind: Secret +metadata: + name: db-credentials +type: Opaque +data: + postgres_password: \ No newline at end of file From 55ee2bbece8125ff1c6e58e1738ad11ad0194551 Mon Sep 17 00:00:00 2001 From: bertrand Date: Fri, 16 Feb 2024 15:16:40 +0100 Subject: [PATCH 03/15] wip --- .Rprofile | 2 - .gitignore | 1 + Dockerfile | 8 +- README.md | 12 +++ app/logic/cloud_logic.R | 65 +++++++++--- app/logic/constant.R | 4 +- app/logic/data_load.R | 12 ++- app/logic/trisk_button_logic.R | 10 +- app/view/modules/trisk_button.R | 81 ++++++++++++--- crispy-app-deployment.yaml | 21 ++++ crispy-app-service.yaml | 12 +++ dependencies.R | 3 + hpa-cpu.yaml | 13 +++ renv.lock | 102 ++++++++++++------- scripts/trisk_k8s_api/app-deployment.yaml | 4 +- scripts/trisk_k8s_api/hpa-memory.yaml | 19 ++++ scripts/trisk_k8s_api/readme.md | 15 ++- scripts/trisk_k8s_api/trisk-api-ingress.yaml | 16 +++ 18 files changed, 314 insertions(+), 86 deletions(-) create mode 100644 crispy-app-deployment.yaml create mode 100644 crispy-app-service.yaml create mode 100644 hpa-cpu.yaml create mode 100644 scripts/trisk_k8s_api/hpa-memory.yaml create mode 100644 scripts/trisk_k8s_api/trisk-api-ingress.yaml diff --git a/.Rprofile b/.Rprofile index 224b9c5..a8266d3 100644 --- a/.Rprofile +++ b/.Rprofile @@ -9,5 +9,3 @@ if (file.exists("renv")) { options(box.path = getwd()) -Sys.setenv(TRISK_INPUT_PATH = file.path("app", "data", "st_inputs")) -Sys.setenv(BACKEND_TRISK_RUN_FOLDER = file.path("app", "data", "backend_db")) diff --git a/.gitignore b/.gitignore index 8a60057..8e4dfa0 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ package.json cypress.config.js package-lock.json scripts/trisk_k8s_api/st_inputs/* + diff --git a/Dockerfile b/Dockerfile index 182081b..6e95ef8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ FROM rocker/shiny:4.1.0 ENV DEBIAN_FRONTEND=noninteractive +ENV CRISPY_APP_ENV="prod" # Install system dependencies RUN apt-get update -qq \ @@ -11,7 +12,6 @@ RUN apt-get update -qq \ libudunits2-dev \ && rm -rf /var/lib/apt/lists/* - WORKDIR /srv/shiny-server RUN rm -rf * @@ -20,10 +20,8 @@ COPY --chown=shiny:shiny .Rprofile renv.lock ./ COPY --chown=shiny:shiny renv/activate.R renv/ RUN sudo -u shiny Rscript -e 'renv::restore(clean = TRUE)' - -# set environment variables -ENV TRISK_INPUT_PATH = "app/data/st_inputs" -ENV BACKEND_TRISK_RUN_FOLDER = "app/data/backend_db" +ENV CRISPY_APP_ENV="prod" +ENV TRISK_API_ENDPOINT=NULL # Copy app COPY --chown=shiny:shiny app.R ./ diff --git a/README.md b/README.md index fb9847a..fad668a 100644 --- a/README.md +++ b/README.md @@ -48,3 +48,15 @@ renv::install() # Install added packages renv::snapshot() # Update the lockfile renv::restore(clean = TRUE) # Uninstall removed packages ``` + + +## Cloud Deployment + +The app can be deployed on kubernetes by following those instructions : + +- First, deploy the TRISK api in the scripts/trisk_k8s_api folder +- pull the crispy app dockerfile, and verify its tag url matches the one in crispy-app-deployment.yaml +- run those commands : + +kubectl apply -f crispy-app-deployment.yaml +kubectl apply -f crispy-app-service.yaml \ No newline at end of file diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R index 7d72782..511ad4e 100644 --- a/app/logic/cloud_logic.R +++ b/app/logic/cloud_logic.R @@ -1,12 +1,36 @@ + + trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint){ - print("in api") - browser() + + # Define the URL + # trisk_api_service <- "trisk-api-service" + trisk_api_service <- Sys.getenv("TRISK_API_SERVICE") + url <- paste0("http://",trisk_api_service,":80/compute_trisk/") + # url <- "http://164.90.241.52:80/compute_trisk/" + + # Define the body of the request + body <- list( + trisk_run_params = trisk_run_params + ) + # Convert the body to JSON + body_json <- jsonlite::toJSON(body, auto_unbox = TRUE) + + # Make the POST request with a 6-minute timeout + response <- httr::POST(url, body = body_json, httr::add_headers(`Content-Type` = "application/json"), httr::timeout(360)) + + # Check the response + status_code <- httr::status_code(response) + + if(status_code!=200){ + stop("The request failed with status code ", status_code) + } + + content <- httr::content(response, "text", encoding = "UTF-8") + run_id <- jsonlite::fromJSON(content)$trisk_run_id + + return(run_id) - # curl -X 'POST' \ - # 'http://188.166.192.175/compute_trisk/' \ - # -H 'Content-Type: application/json' \ - # -d '{"trisk_run_params": {...}}' } @@ -17,9 +41,9 @@ get_data_from_postgres <- function( db_port, db_user, db_password, - query_filter -) { - browser() + query_filter=NULL, + default_tibble=tibble::tibble()) { + # Create a connection string conn <- DBI::dbConnect(RPostgres::Postgres(), dbname = dbname, @@ -28,14 +52,23 @@ get_data_from_postgres <- function( user = db_user, password = db_password) - # Construct the SQL query - query <- paste("SELECT * FROM", table_name, "WHERE", query_filter) - - # Execute the query and fetch results - data <- DBI::dbGetQuery(conn, query) - + if (DBI::dbExistsTable(conn, table_name)){ + # Construct the SQL query + if (is.null(query_filter)) { + query <- paste("SELECT * FROM", table_name) + } else{ + query <- paste("SELECT * FROM", table_name, "WHERE", query_filter) + } + + + # Execute the query and fetch results + table_data <- DBI::dbGetQuery(conn, query) + table_data <- tibble::as_tibble(table_data) + } else{ + table_data <- default_tibble + } # Close the connection DBI::dbDisconnect(conn) - return(data) + return(table_data) } diff --git a/app/logic/constant.R b/app/logic/constant.R index 3b8e671..bd4313f 100644 --- a/app/logic/constant.R +++ b/app/logic/constant.R @@ -2,8 +2,8 @@ # ENV CONSTANTS ==================================== -trisk_input_path <- Sys.getenv("TRISK_INPUT_PATH") -backend_trisk_run_folder <- Sys.getenv("BACKEND_TRISK_RUN_FOLDER") +trisk_input_path <- file.path("app","data","st_inputs") +backend_trisk_run_folder <- file.path("app", "data", "backend_db") api_endpoint <- Sys.getenv("TRISK_API_ENDPOINT") diff --git a/app/logic/data_load.R b/app/logic/data_load.R index 0ba5933..6c636bf 100644 --- a/app/logic/data_load.R +++ b/app/logic/data_load.R @@ -14,6 +14,13 @@ base_data_load <- function(table_name, run_id = NULL, backend_trisk_run_folder = table_data <- default_tibble } } else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { + +if (!is.null(run_id)){ + query_filter <- paste0("run_id = '", run_id, "'") +} else{ +query_filter <- NULL +} + table_data <- get_data_from_postgres( table_name = table_name, dbname = Sys.getenv("ST_POSTGRES_DB"), @@ -21,7 +28,8 @@ base_data_load <- function(table_name, run_id = NULL, backend_trisk_run_folder = db_port = Sys.getenv("ST_POSTGRES_PORT"), db_user = Sys.getenv("ST_POSTGRES_USERNAME"), db_password = Sys.getenv("ST_POSTGRES_PASSWORD"), - query_filter=paste0("run_id = '", run_id, "'") + query_filter=query_filter, + default_tibble = default_tibble ) } else { stop("must fill in a backend_trisk_run_folder") @@ -74,7 +82,7 @@ load_backend_trajectories_data <- function(backend_trisk_run_folder, run_id = NU load_backend_trisk_run_metadata <- function(backend_trisk_run_folder, run_id = NULL) { - backend_trisk_run_metadata_path <- base_data_load( + backend_trisk_run_metadata <- base_data_load( table_name = "run_metadata", run_id = run_id, backend_trisk_run_folder = backend_trisk_run_folder, diff --git a/app/logic/trisk_button_logic.R b/app/logic/trisk_button_logic.R index 50910af..fe8d1bb 100644 --- a/app/logic/trisk_button_logic.R +++ b/app/logic/trisk_button_logic.R @@ -48,10 +48,7 @@ trisk_generator <- function( trisk_run_params, max_trisk_granularity) { - # Check if the run already exists (locally OR in database) - run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) - if (!is.null(run_id)) { if (Sys.getenv("CRISPY_APP_ENV") == "dev") { st_results_wrangled_and_checked <- tryCatch( { @@ -69,20 +66,21 @@ trisk_generator <- function( ) if (!is.null(st_results_wrangled_and_checked)) { - run_id <- append_st_results_to_backend_data( + append_st_results_to_backend_data( st_results_wrangled_and_checked, backend_trisk_run_folder, max_trisk_granularity ) - + run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) } } else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { + run_id <- trigger_trisk_api_computation(trisk_run_params) } else { stop("must set environment variable CRISPY_APP_ENV to 'dev' or 'prod'") } - } + return(run_id) } diff --git a/app/view/modules/trisk_button.R b/app/view/modules/trisk_button.R index 9167625..950490e 100644 --- a/app/view/modules/trisk_button.R +++ b/app/view/modules/trisk_button.R @@ -1,6 +1,6 @@ # Load required packages box::use( - shiny[moduleServer, NS, div, h1, tags, reactiveVal, observeEvent, reactive], + shiny[moduleServer, NS, div, h1, tags, reactiveVal, observeEvent, reactive, observe], shiny.semantic[semanticPage], semantic.dashboard[dashboardPage, dashboardBody, dashboardSidebar, dashboardHeader], shinyjs[useShinyjs] @@ -8,7 +8,12 @@ box::use( box::use( app / logic / trisk_button_logic[ - trisk_generator + trisk_generator , + check_if_run_exists + ], + app / logic/ data_load[ + load_backend_crispy_data, + load_backend_trajectories_data ] ) @@ -28,7 +33,16 @@ ui <- function(id) { tags$div(class = "header", "Processing"), tags$div( class = "content", - tags$p("Please wait...") + tags$p("Please wait while the model is being run with the chosen parameters. This may take up to 10 minutes.") + ) + ), + tags$div( + id = ns("model_load_db"), + class = "ui modal", + tags$div(class = "header", "Fetching run results"), + tags$div( + class = "content", + tags$p("Getting model results...") ) ), tags$div( @@ -59,12 +73,6 @@ server <- function( # fetch or compute trisk on button click shiny::observeEvent(input$run_trisk, ignoreNULL = T, { - # open the model dialog - shinyjs::runjs( - paste0( - "$('#", session$ns("mymodal"), "').modal({closable: true}).modal('show');" - ) - ) if (!is.null(trisk_run_params_r())) { trisk_run_params <- shiny::reactiveValuesToList(trisk_run_params_r()) @@ -78,6 +86,16 @@ server <- function( if (trisk_run_params$carbon_price_model == "no_carbon_tax") { trisk_run_params$market_passthrough <- 0 } + # Check if the run already exists (locally OR in database) + run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) + + if (is.null(run_id)) { + # open the model dialog + shinyjs::runjs( + paste0( + "$('#", session$ns("mymodal"), "').modal({closable: true}).modal('show');" + ) + ) # get run_id either by running locally, or by fetching from backend run_id <- trisk_generator( @@ -86,7 +104,8 @@ server <- function( trisk_run_params = trisk_run_params, max_trisk_granularity = max_trisk_granularity ) - } + } + } } # close the modal dialog @@ -95,11 +114,13 @@ server <- function( "$('#", session$ns("mymodal"), "').modal('hide');" ) ) + run_id_r(run_id) }) # load trisk outputs either from local storage, or cloud backend trisk_outputs <- fetch_crispy_and_trajectories_data( + session=session, backend_trisk_run_folder = backend_trisk_run_folder, run_id_r = run_id_r, trisk_granularity_r = trisk_granularity_r @@ -119,24 +140,54 @@ server <- function( } -fetch_crispy_and_trajectories_data <- function(backend_trisk_run_folder, +fetch_crispy_and_trajectories_data <- function(session, backend_trisk_run_folder, run_id_r, trisk_granularity_r) { # FETCH CRISPY AND TRAJECTORIES DATA ========================= # Connect to the data sources, filter run perimter, and process to the appropriate granularity + raw_crispy_data_r <- reactiveVal() + raw_trajectories_data_r <- reactiveVal() + + observe({ + if (!is.null(run_id_r())) { + + shinyjs::runjs( + paste0( + "$('#", session$ns("model_load_db"), "').modal({closable: true}).modal('show');" + ) + ) + + raw_crispy_data_r( + load_backend_crispy_data(backend_trisk_run_folder, run_id = run_id_r()) + ) + + raw_trajectories_data_r( + load_backend_trajectories_data(backend_trisk_run_folder, run_id = run_id_r()) + ) + + + # close the modal dialog + shinyjs::runjs( + paste0( + "$('#", session$ns("model_load_db"), "').modal('hide');" + ) + ) + } + }) + crispy_data_r <- reactiveVal() trajectories_data_r <- reactiveVal() - observeEvent(c(run_id_r(), trisk_granularity_r()), ignoreInit = TRUE, { - if (!is.null(run_id_r())) { + observe({ + if (!is.null(trisk_granularity_r()) & !is.null(raw_crispy_data_r()) & !is.null(raw_trajectories_data_r())) { crispy_data_r( - load_backend_crispy_data(backend_trisk_run_folder, run_id == run_id_r()) |> + raw_crispy_data_r() |> stress.test.plot.report::main_load_multi_crispy_data(granularity = trisk_granularity_r()) ) trajectories_data_r( - load_backend_trajectories_data(backend_trisk_run_folder, run_id == run_id_r()) |> + raw_trajectories_data_r() |> stress.test.plot.report::main_data_load_trajectories_data(granularity = trisk_granularity_r()) ) } diff --git a/crispy-app-deployment.yaml b/crispy-app-deployment.yaml new file mode 100644 index 0000000..aacfaba --- /dev/null +++ b/crispy-app-deployment.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: crispy-app +spec: + replicas: 2 + selector: + matchLabels: + app: crispy-app + template: + metadata: + labels: + app: crispy-app + spec: + # nodeSelector: + # nodepool: pool-shiny-crispy + containers: + - name: crispy-app + image: registry.digitalocean.com/theia-1in1000-shinyapps/crispy_app:latest + ports: + - containerPort: 3838 # Default Shiny Server port diff --git a/crispy-app-service.yaml b/crispy-app-service.yaml new file mode 100644 index 0000000..8189421 --- /dev/null +++ b/crispy-app-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: crispy-app-service +spec: + type: LoadBalancer + selector: + app: crispy-app + ports: + - protocol: TCP + port: 80 + targetPort: 3838 diff --git a/dependencies.R b/dependencies.R index 7daa601..917ea7a 100644 --- a/dependencies.R +++ b/dependencies.R @@ -24,6 +24,9 @@ library(DT) # library(gridExtra) # library(ggpubr) library(zip) +library(jsonlite) +library(httr) +library(RPostgres) library(r2dii.climate.stress.test) diff --git a/hpa-cpu.yaml b/hpa-cpu.yaml new file mode 100644 index 0000000..e1163eb --- /dev/null +++ b/hpa-cpu.yaml @@ -0,0 +1,13 @@ +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: trisk-api-hpa + namespace: default # Adjust if your deployment is in a different namespace +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: trisk-api + minReplicas: 1 # Start with 1 replica + maxReplicas: 10 # Adjust based on your maximum expected scale + targetCPUUtilizationPercentage: 80 # Adjust based on your needs diff --git a/renv.lock b/renv.lock index 14ae65b..b13bcb7 100644 --- a/renv.lock +++ b/renv.lock @@ -9,6 +9,17 @@ ] }, "Packages": { + "DBI": { + "Package": "DBI", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "9b4993e98e0e19da84c168460c032fef" + }, "DT": { "Package": "DT", "Version": "0.31", @@ -132,6 +143,25 @@ ], "Hash": "45f0398006e83a5b10b72a90663d8d8c" }, + "RPostgres": { + "Package": "RPostgres", + "Version": "1.4.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DBI", + "R", + "bit64", + "blob", + "cpp11", + "hms", + "lubridate", + "methods", + "plogr", + "withr" + ], + "Hash": "a3ccabc3de4657c14185c91f3e6d4b60" + }, "Rcpp": { "Package": "Rcpp", "Version": "1.0.12", @@ -283,6 +313,18 @@ ], "Hash": "9fe98599ca456d6552421db0d6772d8f" }, + "blob": { + "Package": "blob", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods", + "rlang", + "vctrs" + ], + "Hash": "40415719b5a479b87949f3aa0aee737c" + }, "box": { "Package": "box", "Version": "1.1.3", @@ -827,6 +869,21 @@ ], "Hash": "d23d2879001f3d82ee9dc38a9ef53c4c" }, + "httr": { + "Package": "httr", + "Version": "1.4.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "curl", + "jsonlite", + "mime", + "openssl" + ], + "Hash": "ac107251d9d9fd72f0ca8049988f1d7f" + }, "isoband": { "Package": "isoband", "Version": "0.2.7", @@ -1071,18 +1128,6 @@ ], "Hash": "2a0dc8c6adfb6f032e4d4af82d258ab5" }, - "packrat": { - "Package": "packrat", - "Version": "0.9.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "tools", - "utils" - ], - "Hash": "55ddd2d4a1959535f18393478b0c14a6" - }, "patchwork": { "Package": "patchwork", "Version": "1.2.0", @@ -1164,6 +1209,13 @@ ], "Hash": "876c618df5ae610be84356d5d7a5d124" }, + "plogr": { + "Package": "plogr", + "Version": "0.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "09eb987710984fc2905c7129c7d85e65" + }, "praise": { "Package": "praise", "Version": "1.0.0", @@ -1509,28 +1561,6 @@ ], "Hash": "4c8415e0ec1e29f3f4f6fc108bef0144" }, - "rsconnect": { - "Package": "rsconnect", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "curl", - "digest", - "jsonlite", - "lifecycle", - "openssl", - "packrat", - "renv", - "rlang", - "rstudioapi", - "tools", - "yaml" - ], - "Hash": "c064d4993aedbf6c383041d1606aabeb" - }, "rstudioapi": { "Package": "rstudioapi", "Version": "0.15.0", @@ -1683,7 +1713,7 @@ "RemoteUsername": "2DegreesInvesting", "RemoteRepo": "stress.test.plot.report", "RemoteRef": "master", - "RemoteSha": "52125c9fc34b8034d253029471ad86168ef04fda", + "RemoteSha": "e6745213250f5805c869dc7ae772db28d5d82ee7", "Remotes": "2DegreesInvesting/r2dii.climate.stress.test, 2DegreesInvesting/STDataMGMT, RMI-PACTA/r2dii.colours", "Requirements": [ "box", @@ -1699,7 +1729,7 @@ "tidytext", "withr" ], - "Hash": "8f9e2bf158d3465e041df9bd7fbda48f" + "Hash": "62184091f35034d10fbb36353de0cf96" }, "stringi": { "Package": "stringi", diff --git a/scripts/trisk_k8s_api/app-deployment.yaml b/scripts/trisk_k8s_api/app-deployment.yaml index 494eeb7..b8626c4 100644 --- a/scripts/trisk_k8s_api/app-deployment.yaml +++ b/scripts/trisk_k8s_api/app-deployment.yaml @@ -3,7 +3,7 @@ kind: Deployment metadata: name: trisk-api spec: - replicas: 2 # Start with 2 replicas; adjust as necessary + # replicas: 2 # Start with 2 replicas; adjust as necessary selector: matchLabels: app: trisk-api @@ -12,6 +12,8 @@ spec: labels: app: trisk-api spec: + # nodeSelector: + # nodepool: pool-trisk-api containers: - name: trisk-api image: registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest # Replace with your actual image path diff --git a/scripts/trisk_k8s_api/hpa-memory.yaml b/scripts/trisk_k8s_api/hpa-memory.yaml new file mode 100644 index 0000000..d78e05e --- /dev/null +++ b/scripts/trisk_k8s_api/hpa-memory.yaml @@ -0,0 +1,19 @@ +apiVersion: autoscaling/v2beta2 +kind: HorizontalPodAutoscaler +metadata: + name: trisk-api-hpa + namespace: default +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: trisk-api + minReplicas: 1 + maxReplicas: 10 + metrics: + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: 80 diff --git a/scripts/trisk_k8s_api/readme.md b/scripts/trisk_k8s_api/readme.md index d919096..7be3ccf 100644 --- a/scripts/trisk_k8s_api/readme.md +++ b/scripts/trisk_k8s_api/readme.md @@ -32,7 +32,9 @@ curl -X 'POST' \ # DEPLOY -docker push +https://docs.digitalocean.com/products/kubernetes/how-to/set-up-autoscaling/ + +docker push registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest ## kubectl commands @@ -45,6 +47,10 @@ kubectl logs kubectl apply -f app-deployment.yaml kubectl apply -f app-service.yaml +kubectl autoscale deployment trisk-api --cpu-percent=50 --min=2 --max=10 +kubectl get hpa + + kubectl get svc kubectl get deployment @@ -55,3 +61,10 @@ kubectl rollout restart deployment kubectl delete deployment +# To create db-credentials.yaml + + +echo -n DB_PASSWORD | base64 + +kubectl apply -f db-credentials.yaml + diff --git a/scripts/trisk_k8s_api/trisk-api-ingress.yaml b/scripts/trisk_k8s_api/trisk-api-ingress.yaml new file mode 100644 index 0000000..45f9684 --- /dev/null +++ b/scripts/trisk_k8s_api/trisk-api-ingress.yaml @@ -0,0 +1,16 @@ +# trisk-api-ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: trisk-api-ingress +spec: + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: trisk-api-service + port: + number: 80 From d115c66faad2ab7aa2854b48d226165135602881 Mon Sep 17 00:00:00 2001 From: bertrand Date: Fri, 16 Feb 2024 16:48:43 +0100 Subject: [PATCH 04/15] tidy --- .Rprofile | 2 - Dockerfile | 4 +- app/logic/cloud_logic.R | 58 ++++++++++++------------ app/logic/constant.R | 2 +- app/logic/data_load.R | 22 +++++----- app/logic/data_write.R | 30 ++++++------- app/logic/trisk_button_logic.R | 78 +++++++++++++++------------------ app/logic/trisk_mgmt.R | 4 +- app/main.R | 2 + app/view/modules/trisk_button.R | 57 ++++++++++++------------ 10 files changed, 119 insertions(+), 140 deletions(-) diff --git a/.Rprofile b/.Rprofile index a8266d3..3b081a1 100644 --- a/.Rprofile +++ b/.Rprofile @@ -7,5 +7,3 @@ if (file.exists("renv")) { # Allow absolute module imports (relative to the app root). options(box.path = getwd()) - - diff --git a/Dockerfile b/Dockerfile index 6e95ef8..1bf1efa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,10 +18,8 @@ RUN rm -rf * # Install R dependencies COPY --chown=shiny:shiny .Rprofile renv.lock ./ COPY --chown=shiny:shiny renv/activate.R renv/ -RUN sudo -u shiny Rscript -e 'renv::restore(clean = TRUE)' +RUN sudo -u shiny Rscript -e 'renv::restore()' -ENV CRISPY_APP_ENV="prod" -ENV TRISK_API_ENDPOINT=NULL # Copy app COPY --chown=shiny:shiny app.R ./ diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R index 511ad4e..2b7c01b 100644 --- a/app/logic/cloud_logic.R +++ b/app/logic/cloud_logic.R @@ -1,11 +1,8 @@ - - -trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint){ - +trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint) { # Define the URL # trisk_api_service <- "trisk-api-service" trisk_api_service <- Sys.getenv("TRISK_API_SERVICE") - url <- paste0("http://",trisk_api_service,":80/compute_trisk/") + url <- paste0("http://", trisk_api_service, ":80/compute_trisk/") # url <- "http://164.90.241.52:80/compute_trisk/" # Define the body of the request @@ -22,53 +19,52 @@ trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint){ # Check the response status_code <- httr::status_code(response) - if(status_code!=200){ + if (status_code != 200) { stop("The request failed with status code ", status_code) - } - - content <- httr::content(response, "text", encoding = "UTF-8") + } + + content <- httr::content(response, "text", encoding = "UTF-8") run_id <- jsonlite::fromJSON(content)$trisk_run_id return(run_id) - } get_data_from_postgres <- function( - table_name, - dbname, - host_db, - db_port, - db_user, - db_password, - query_filter=NULL, - default_tibble=tibble::tibble()) { - + table_name, + dbname, + host_db, + db_port, + db_user, + db_password, + query_filter = NULL, + default_tibble = tibble::tibble()) { # Create a connection string conn <- DBI::dbConnect(RPostgres::Postgres(), - dbname = dbname, - host = host_db, - port = db_port, - user = db_user, - password = db_password) - - if (DBI::dbExistsTable(conn, table_name)){ + dbname = dbname, + host = host_db, + port = db_port, + user = db_user, + password = db_password + ) + + if (DBI::dbExistsTable(conn, table_name)) { # Construct the SQL query if (is.null(query_filter)) { query <- paste("SELECT * FROM", table_name) - } else{ + } else { query <- paste("SELECT * FROM", table_name, "WHERE", query_filter) } - - + + # Execute the query and fetch results table_data <- DBI::dbGetQuery(conn, query) table_data <- tibble::as_tibble(table_data) - } else{ + } else { table_data <- default_tibble } # Close the connection DBI::dbDisconnect(conn) - + return(table_data) } diff --git a/app/logic/constant.R b/app/logic/constant.R index bd4313f..6652292 100644 --- a/app/logic/constant.R +++ b/app/logic/constant.R @@ -2,7 +2,7 @@ # ENV CONSTANTS ==================================== -trisk_input_path <- file.path("app","data","st_inputs") +trisk_input_path <- file.path("app", "data", "st_inputs") backend_trisk_run_folder <- file.path("app", "data", "backend_db") api_endpoint <- Sys.getenv("TRISK_API_ENDPOINT") diff --git a/app/logic/data_load.R b/app/logic/data_load.R index 6c636bf..1573542 100644 --- a/app/logic/data_load.R +++ b/app/logic/data_load.R @@ -1,5 +1,5 @@ box::use( - app/logic/cloud_logic[ + app / logic / cloud_logic[ get_data_from_postgres ] ) @@ -9,18 +9,17 @@ base_data_load <- function(table_name, run_id = NULL, backend_trisk_run_folder = table_data_path <- fs::path(backend_trisk_run_folder, table_name, ext = "parquet") if (file.exists(table_data_path)) { table_data <- arrow::read_parquet(table_data_path) |> - dplyr::filter(.data$run_id == run_id) + dplyr::filter(.data$run_id == run_id) } else { table_data <- default_tibble } } else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { - -if (!is.null(run_id)){ - query_filter <- paste0("run_id = '", run_id, "'") -} else{ -query_filter <- NULL -} - + if (!is.null(run_id)) { + query_filter <- paste0("run_id = '", run_id, "'") + } else { + query_filter <- NULL + } + table_data <- get_data_from_postgres( table_name = table_name, dbname = Sys.getenv("ST_POSTGRES_DB"), @@ -28,11 +27,11 @@ query_filter <- NULL db_port = Sys.getenv("ST_POSTGRES_PORT"), db_user = Sys.getenv("ST_POSTGRES_USERNAME"), db_password = Sys.getenv("ST_POSTGRES_PASSWORD"), - query_filter=query_filter, + query_filter = query_filter, default_tibble = default_tibble ) } else { - stop("must fill in a backend_trisk_run_folder") + stop("You must set the env variable CRISPY_APP_ENV to either 'dev' or 'prod'") } return(table_data) @@ -106,4 +105,3 @@ load_backend_trisk_run_metadata <- function(backend_trisk_run_folder, run_id = N return(backend_trisk_run_metadata) } - diff --git a/app/logic/data_write.R b/app/logic/data_write.R index 90b2b4a..d669270 100644 --- a/app/logic/data_write.R +++ b/app/logic/data_write.R @@ -1,3 +1,4 @@ +# Local backend data writing function # Function to append stress test results to backend data # It iterates over the names of the results, processes the data accordingly and appends it to the existing data # The updated data is then written back to the file @@ -5,7 +6,7 @@ append_st_results_to_backend_data <- function( st_results_wrangled_and_checked, backend_trisk_run_folder, max_trisk_granularity) { - # Iterate over the names of the results + # Iterate over the names of the results for (fname in names(st_results_wrangled_and_checked)) { # Get the new data from the results new_data <- st_results_wrangled_and_checked[[fname]] @@ -20,24 +21,21 @@ append_st_results_to_backend_data <- function( stress.test.plot.report::main_data_load_trajectories_data(granularity = names(max_trisk_granularity)) } - # Get the path of the file to write the data to - fpath <- fs::path(backend_trisk_run_folder, fname, ext = "parquet") + # Get the path of the file to write the data to + fpath <- fs::path(backend_trisk_run_folder, fname, ext = "parquet") - # If the file exists, read the existing data, otherwise set the existing data to NULL - if (file.exists(fpath)) { - persistent_data <- read_parquet(fpath) - } else { - persistent_data <- NULL - } - - # Append the new data to the existing data - persistent_data <- bind_rows(persistent_data, new_data) + # If the file exists, read the existing data, otherwise set the existing data to NULL + if (file.exists(fpath)) { + persistent_data <- read_parquet(fpath) + } else { + persistent_data <- NULL + } - # Write the updated data back to the file - write_parquet(persistent_data, fpath) + # Append the new data to the existing data + persistent_data <- bind_rows(persistent_data, new_data) + # Write the updated data back to the file + write_parquet(persistent_data, fpath) } return(run_id) } - - diff --git a/app/logic/trisk_button_logic.R b/app/logic/trisk_button_logic.R index fe8d1bb..3ee5aa7 100644 --- a/app/logic/trisk_button_logic.R +++ b/app/logic/trisk_button_logic.R @@ -1,15 +1,15 @@ box::use( - app/logic/trisk_mgmt[ - run_trisk_with_params - ], - app/logic/cloud_logic[ + app / logic / trisk_mgmt[ + run_trisk_with_params + ], + app / logic / cloud_logic[ trigger_trisk_api_computation, ], - app/logic/data_load[ + app / logic / data_load[ load_backend_trisk_run_metadata ], - app/logic/data_write[ - append_st_results_to_backend_data + app / logic / data_write[ + append_st_results_to_backend_data ] ) @@ -47,43 +47,35 @@ trisk_generator <- function( trisk_input_path, trisk_run_params, max_trisk_granularity) { + if (Sys.getenv("CRISPY_APP_ENV") == "dev") { + st_results_wrangled_and_checked <- tryCatch( + { + run_trisk_with_params( + trisk_run_params, + trisk_input_path + ) + }, + error = function(e) { + print(e$message) + print("\n\n") + format_error_message(trisk_run_params) + NULL + } + ) + if (!is.null(st_results_wrangled_and_checked)) { + append_st_results_to_backend_data( + st_results_wrangled_and_checked, + backend_trisk_run_folder, + max_trisk_granularity + ) + run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) + } + } else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { + run_id <- trigger_trisk_api_computation(trisk_run_params) + } else { + stop("must set environment variable CRISPY_APP_ENV to 'dev' or 'prod'") + } - if (Sys.getenv("CRISPY_APP_ENV") == "dev") { - st_results_wrangled_and_checked <- tryCatch( - { - run_trisk_with_params( - trisk_run_params, - trisk_input_path - ) - }, - error = function(e) { - print(e$message) - print("\n\n") - format_error_message(trisk_run_params) - NULL - } - ) - - if (!is.null(st_results_wrangled_and_checked)) { - append_st_results_to_backend_data( - st_results_wrangled_and_checked, - backend_trisk_run_folder, - max_trisk_granularity - ) - run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) - } - } - else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { - - run_id <- trigger_trisk_api_computation(trisk_run_params) - } else { - stop("must set environment variable CRISPY_APP_ENV to 'dev' or 'prod'") - } - return(run_id) } - - - - diff --git a/app/logic/trisk_mgmt.R b/app/logic/trisk_mgmt.R index 519a0e9..a97e0da 100644 --- a/app/logic/trisk_mgmt.R +++ b/app/logic/trisk_mgmt.R @@ -9,8 +9,8 @@ box::use( box::use( app / logic / trisk_mgmt[ - run_trisk_with_params, - format_error_message + run_trisk_with_params, + format_error_message ], app / logic / data_load[ load_backend_trajectories_data, diff --git a/app/main.R b/app/main.R index 39aa5bd..40ee2f1 100644 --- a/app/main.R +++ b/app/main.R @@ -158,6 +158,8 @@ ui <- function(id) { #' @export server <- function(id) { moduleServer(id, function(input, output, session) { + print("CRISPY_APP_ENV") + print(Sys.getenv("CRISPY_APP_ENV")) possible_trisk_combinations <- r2dii.climate.stress.test::get_scenario_geography_x_ald_sector(trisk_input_path) # the TRISK runs are generated In the sidebar module diff --git a/app/view/modules/trisk_button.R b/app/view/modules/trisk_button.R index 950490e..68d6284 100644 --- a/app/view/modules/trisk_button.R +++ b/app/view/modules/trisk_button.R @@ -8,10 +8,10 @@ box::use( box::use( app / logic / trisk_button_logic[ - trisk_generator , + trisk_generator, check_if_run_exists ], - app / logic/ data_load[ + app / logic / data_load[ load_backend_crispy_data, load_backend_trajectories_data ] @@ -36,7 +36,7 @@ ui <- function(id) { tags$p("Please wait while the model is being run with the chosen parameters. This may take up to 10 minutes.") ) ), - tags$div( + tags$div( id = ns("model_load_db"), class = "ui modal", tags$div(class = "header", "Fetching run results"), @@ -73,7 +73,6 @@ server <- function( # fetch or compute trisk on button click shiny::observeEvent(input$run_trisk, ignoreNULL = T, { - if (!is.null(trisk_run_params_r())) { trisk_run_params <- shiny::reactiveValuesToList(trisk_run_params_r()) @@ -86,26 +85,26 @@ server <- function( if (trisk_run_params$carbon_price_model == "no_carbon_tax") { trisk_run_params$market_passthrough <- 0 } - # Check if the run already exists (locally OR in database) - run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) - - if (is.null(run_id)) { - # open the model dialog - shinyjs::runjs( - paste0( - "$('#", session$ns("mymodal"), "').modal({closable: true}).modal('show');" - ) - ) - - # get run_id either by running locally, or by fetching from backend - run_id <- trisk_generator( - backend_trisk_run_folder = backend_trisk_run_folder, - trisk_input_path = trisk_input_path, - trisk_run_params = trisk_run_params, - max_trisk_granularity = max_trisk_granularity - ) - } - } + # Check if the run already exists (locally OR in database) + run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) + + if (is.null(run_id)) { + # open the model dialog + shinyjs::runjs( + paste0( + "$('#", session$ns("mymodal"), "').modal({closable: true}).modal('show');" + ) + ) + + # get run_id either by running locally, or by fetching from backend + run_id <- trisk_generator( + backend_trisk_run_folder = backend_trisk_run_folder, + trisk_input_path = trisk_input_path, + trisk_run_params = trisk_run_params, + max_trisk_granularity = max_trisk_granularity + ) + } + } } # close the modal dialog @@ -114,13 +113,13 @@ server <- function( "$('#", session$ns("mymodal"), "').modal('hide');" ) ) - + run_id_r(run_id) }) # load trisk outputs either from local storage, or cloud backend trisk_outputs <- fetch_crispy_and_trajectories_data( - session=session, + session = session, backend_trisk_run_folder = backend_trisk_run_folder, run_id_r = run_id_r, trisk_granularity_r = trisk_granularity_r @@ -151,7 +150,6 @@ fetch_crispy_and_trajectories_data <- function(session, backend_trisk_run_folder observe({ if (!is.null(run_id_r())) { - shinyjs::runjs( paste0( "$('#", session$ns("model_load_db"), "').modal({closable: true}).modal('show');" @@ -161,12 +159,10 @@ fetch_crispy_and_trajectories_data <- function(session, backend_trisk_run_folder raw_crispy_data_r( load_backend_crispy_data(backend_trisk_run_folder, run_id = run_id_r()) ) - raw_trajectories_data_r( load_backend_trajectories_data(backend_trisk_run_folder, run_id = run_id_r()) ) - # close the modal dialog shinyjs::runjs( paste0( @@ -181,15 +177,16 @@ fetch_crispy_and_trajectories_data <- function(session, backend_trisk_run_folder observe({ if (!is.null(trisk_granularity_r()) & !is.null(raw_crispy_data_r()) & !is.null(raw_trajectories_data_r())) { + crispy_data_r( raw_crispy_data_r() |> stress.test.plot.report::main_load_multi_crispy_data(granularity = trisk_granularity_r()) ) - trajectories_data_r( raw_trajectories_data_r() |> stress.test.plot.report::main_data_load_trajectories_data(granularity = trisk_granularity_r()) ) + browser() } }) From 2b2f257c48a9a435491c8c10b154522eb54d7f9a Mon Sep 17 00:00:00 2001 From: bertrand Date: Sat, 17 Feb 2024 11:25:21 +0100 Subject: [PATCH 05/15] clean --- app/logic/constant.R | 4 ++-- app/view/modules/trisk_button.R | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/logic/constant.R b/app/logic/constant.R index 6652292..9f3e330 100644 --- a/app/logic/constant.R +++ b/app/logic/constant.R @@ -12,8 +12,8 @@ api_endpoint <- Sys.getenv("TRISK_API_ENDPOINT") # Must be ordered from "less granular" to "more granular" max_trisk_granularity <- list( "ald_sector" = 1, - "ald_business_unit" = 2, - "company_id" = 3 + "ald_business_unit" = 2 + # "company_id" = 3 ) diff --git a/app/view/modules/trisk_button.R b/app/view/modules/trisk_button.R index 68d6284..8a5b869 100644 --- a/app/view/modules/trisk_button.R +++ b/app/view/modules/trisk_button.R @@ -186,7 +186,6 @@ fetch_crispy_and_trajectories_data <- function(session, backend_trisk_run_folder raw_trajectories_data_r() |> stress.test.plot.report::main_data_load_trajectories_data(granularity = trisk_granularity_r()) ) - browser() } }) From fab8cd63efd5bc5b21d3ea898d389dd8b47998a2 Mon Sep 17 00:00:00 2001 From: bergalli Date: Sat, 17 Feb 2024 13:05:53 +0000 Subject: [PATCH 06/15] wip knative --- scripts/trisk_knative/Dockerfile | 40 ++++++++++++ scripts/trisk_knative/main.R | 45 ++++++++++++++ scripts/trisk_knative/trisk_compute.R | 88 +++++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 scripts/trisk_knative/Dockerfile create mode 100644 scripts/trisk_knative/main.R create mode 100644 scripts/trisk_knative/trisk_compute.R diff --git a/scripts/trisk_knative/Dockerfile b/scripts/trisk_knative/Dockerfile new file mode 100644 index 0000000..ca01de8 --- /dev/null +++ b/scripts/trisk_knative/Dockerfile @@ -0,0 +1,40 @@ +FROM rocker/r-ver:4.3.0 + +# RUN apt-get update && apt-get install -y --no-install-recommends \ +# # Install system dependencies required by some R packages and renv +# libcurl4-gnutls-dev \ +# libssl-dev \ +# libxml2-dev \ +# liblzma-dev \ +# libbz2-dev \ +# libpcre2-dev \ +# libpq-dev \ + +# Set the working directory in the container +WORKDIR /app + +# Initialize the R environment with renv and restore dependencies +# Ensure your project includes an renv.lock file +# Install R dependencies +COPY .Rprofile renv.lock ./ +COPY renv/activate.R renv/ +RUN Rscript -e 'renv::restore(clean = TRUE)' + + +# Copy the R project files +COPY ./main.R /app/main.R +COPY ./trisk_compute.R /app/trisk_compute.R +COPY ./st_inputs/* /app/st_inputs/ + +ENV ST_POSTGRES_DB=NULL +ENV ST_POSTGRES_USER=NULL +ENV ST_POSTGRES_PASSWORD=NULL +ENV ST_POSTGRES_HOST=NULL +ENV ST_POSTGRES_PORT=NULL + +# Command to run the app +# Expose the port your app will run on +EXPOSE 8080 + +# Use plumber to run your app +CMD ["Rscript", "/app/main.R"] \ No newline at end of file diff --git a/scripts/trisk_knative/main.R b/scripts/trisk_knative/main.R new file mode 100644 index 0000000..0cce435 --- /dev/null +++ b/scripts/trisk_knative/main.R @@ -0,0 +1,45 @@ +# Define an endpoint that accepts POST requests +# Assume the JSON payload is directly analogous to the R list structure for trisk_run_param + +source("./trisk_compute.R") + +# Create a plumber router +pr <- plumber::plumb() + +validate_trisk_run_params <- function(trisk_run_params) { + required_keys <- names(formals(r2dii.climate.stress.test::run_trisk)) + param_keys <- names(trisk_run_params) + + if (!all(names(param_keys) %in% required_keys)) { + stop("trisk_run_params does not contain the correct keys") + } +} + +pr$handle("POST", "/run", function(req, res){ + + trisk_run_param <- jsonlite::fromJSON(req$postBody) + trisk_run_params <- as.list(trisk_run_params) + trisk_input_path <- as.character(trisk_input_path) + validate_trisk_run_params(trisk_run_params) + + + trisk_input_path <- Sys.getenv("ST_TRISK_INPUT_PATH") + dbname <- Sys.getenv("ST_POSTGRES_DB") + host_db <- Sys.getenv("ST_POSTGRES_HOST") + db_port <- Sys.getenv("ST_POSTGRES_PORT") + db_user <- Sys.getenv("ST_POSTGRES_USERNAME") + db_password <- Sys.getenv("ST_POSTGRES_PASSWORD") + + postgres_conn <- DBI::dbConnect(RPostgres::Postgres(), dbname = dbname, host = host_db, port = db_port, user = db_user, password = db_password) + + run_trisk_and_upload_results_to_db_conn( + trisk_run_params=trisk_run_params, + trisk_input_path=trisk_input_path, + postgres_conn=postgres_conn + ) + + return(run_id) +}) + +# Run the plumber API on port 8080 +pr$run(port=8080) diff --git a/scripts/trisk_knative/trisk_compute.R b/scripts/trisk_knative/trisk_compute.R new file mode 100644 index 0000000..d9bd9f2 --- /dev/null +++ b/scripts/trisk_knative/trisk_compute.R @@ -0,0 +1,88 @@ +run_trisk_and_upload_results_to_db_conn <- function( + trisk_run_params, + trisk_input_path, + postgres_conn) { + + st_results_wrangled_and_checked <- run_trisk_with_params( + trisk_run_params = trisk_run_params, + trisk_input_path = trisk_input_path + ) + if (!is.null(st_results_wrangled_and_checked)) { + run_id <- upload_to_postgres( + st_results_wrangled_and_checked = st_results_wrangled_and_checked, + postgres_conn=postgres_conn + ) + run_id <- unique(st_results_wrangled_and_checked$run_metadata$run_id) + } else { + run_id <- NULL + } + + return(run_id) +} + + + +# Function to run the trisk model with given parameters and input path +# Returns the wrangled and checked results +run_trisk_with_params <- function(trisk_run_params, trisk_input_path) { + tryCatch( + { + # Run the trisk model with the provided parameters and input path + # The results are returned and stored in st_results_wrangled_and_checked + st_results_wrangled_and_checked <- do.call( + r2dii.climate.stress.test::run_trisk, + c( + trisk_run_params, + list( + input_path = trisk_input_path, + output_path = tempdir(), + return_results = TRUE + ) + ) + ) + + # Extract the run metadata from the crispy_output + run_metadata <- dplyr::distinct_at( + st_results_wrangled_and_checked$crispy_output, + c(names(trisk_run_params), "run_id") + ) + + # Add the run metadata to the results + st_results_wrangled_and_checked$run_metadata <- run_metadata + }, + error = function(e) { + # This block will run if there's an error in the try block + + # Print the error message + print(e$message) + + # Print the last error and trace using rlang + print(rlang::last_error()) + print(rlang::last_trace()) + + stop("Error running TRISK") + } + ) + + # Return the results + return(st_results_wrangled_and_checked) +} + + +# postgres_conn is a DBI connection +# postgres_conn <- DBI::dbConnect(RPostgres::Postgres(), dbname = dbname, host = host_db, port = db_port, user = db_user, password = db_password) +upload_to_postgres <- function(postgres_conn, st_results_wrangled_and_checked) { + + # Iterate over the names of the results + for (st_output_name in names(st_results_wrangled_and_checked)) { + # Get the new data from the results + st_output_df <- st_results_wrangled_and_checked[[st_output_name]] + if (DBI::dbExistsTable(postgres_conn, st_output_name)) { + DBI::dbAppendTable(postgres_conn, st_output_name, st_output_df) + } else { + DBI::dbCreateTable(postgres_conn, st_output_name, st_output_df) + } + } + DBI::dbDisconnect(postgres_conn) +} + From ad5e2fa706e4ee1c992531a9615176d19a1ac1af Mon Sep 17 00:00:00 2001 From: bergalli Date: Sat, 17 Feb 2024 13:26:08 +0000 Subject: [PATCH 07/15] wip --- app/logic/cloud_logic.R | 2 +- scripts/trisk_knative/.Rprofile | 1 + scripts/trisk_knative/Dockerfile | 15 +- scripts/trisk_knative/main.R | 2 +- scripts/trisk_knative/renv.lock | 529 +++++++++++++++++++++++++++++++ 5 files changed, 542 insertions(+), 7 deletions(-) create mode 100644 scripts/trisk_knative/.Rprofile create mode 100644 scripts/trisk_knative/renv.lock diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R index 2b7c01b..c718b22 100644 --- a/app/logic/cloud_logic.R +++ b/app/logic/cloud_logic.R @@ -2,7 +2,7 @@ trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint) { # Define the URL # trisk_api_service <- "trisk-api-service" trisk_api_service <- Sys.getenv("TRISK_API_SERVICE") - url <- paste0("http://", trisk_api_service, ":80/compute_trisk/") + url <- paste0("http://", trisk_api_service, ":80/compute_trisk") # url <- "http://164.90.241.52:80/compute_trisk/" # Define the body of the request diff --git a/scripts/trisk_knative/.Rprofile b/scripts/trisk_knative/.Rprofile new file mode 100644 index 0000000..81b960f --- /dev/null +++ b/scripts/trisk_knative/.Rprofile @@ -0,0 +1 @@ +source("renv/activate.R") diff --git a/scripts/trisk_knative/Dockerfile b/scripts/trisk_knative/Dockerfile index ca01de8..53c4070 100644 --- a/scripts/trisk_knative/Dockerfile +++ b/scripts/trisk_knative/Dockerfile @@ -1,14 +1,17 @@ -FROM rocker/r-ver:4.3.0 +FROM rocker/r-ver:latest -# RUN apt-get update && apt-get install -y --no-install-recommends \ -# # Install system dependencies required by some R packages and renv -# libcurl4-gnutls-dev \ +# Install system dependencies required by some R packages and renv +RUN apt-get update && apt-get install -y --no-install-recommends \ + libcurl4-gnutls-dev \ + libpq-dev \ + libsodium-dev # libssl-dev \ # libxml2-dev \ # liblzma-dev \ # libbz2-dev \ # libpcre2-dev \ -# libpq-dev \ + + # Set the working directory in the container WORKDIR /app @@ -26,12 +29,14 @@ COPY ./main.R /app/main.R COPY ./trisk_compute.R /app/trisk_compute.R COPY ./st_inputs/* /app/st_inputs/ +# Define env variables ENV ST_POSTGRES_DB=NULL ENV ST_POSTGRES_USER=NULL ENV ST_POSTGRES_PASSWORD=NULL ENV ST_POSTGRES_HOST=NULL ENV ST_POSTGRES_PORT=NULL + # Command to run the app # Expose the port your app will run on EXPOSE 8080 diff --git a/scripts/trisk_knative/main.R b/scripts/trisk_knative/main.R index 0cce435..d148af2 100644 --- a/scripts/trisk_knative/main.R +++ b/scripts/trisk_knative/main.R @@ -15,7 +15,7 @@ validate_trisk_run_params <- function(trisk_run_params) { } } -pr$handle("POST", "/run", function(req, res){ +pr$handle("POST", "/compute_trisk", function(req, res){ trisk_run_param <- jsonlite::fromJSON(req$postBody) trisk_run_params <- as.list(trisk_run_params) diff --git a/scripts/trisk_knative/renv.lock b/scripts/trisk_knative/renv.lock new file mode 100644 index 0000000..b806ea6 --- /dev/null +++ b/scripts/trisk_knative/renv.lock @@ -0,0 +1,529 @@ +{ + "R": { + "Version": "4.3.1", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cloud.r-project.org" + } + ] + }, + "Packages": { + "DBI": { + "Package": "DBI", + "Version": "1.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "164809cd72e1d5160b4cb3aa57f510fe" + }, + "R6": { + "Package": "R6", + "Version": "2.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "470851b6d5d0ac559e9d01bb352b4021" + }, + "RPostgres": { + "Package": "RPostgres", + "Version": "1.4.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DBI", + "R", + "bit64", + "blob", + "cpp11", + "hms", + "lubridate", + "methods", + "plogr", + "withr" + ], + "Hash": "a3ccabc3de4657c14185c91f3e6d4b60" + }, + "Rcpp": { + "Package": "Rcpp", + "Version": "1.0.12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods", + "utils" + ], + "Hash": "5ea2700d21e038ace58269ecdbeb9ec0" + }, + "bit": { + "Package": "bit", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "d242abec29412ce988848d0294b208fd" + }, + "bit64": { + "Package": "bit64", + "Version": "4.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit", + "methods", + "stats", + "utils" + ], + "Hash": "9fe98599ca456d6552421db0d6772d8f" + }, + "blob": { + "Package": "blob", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods", + "rlang", + "vctrs" + ], + "Hash": "40415719b5a479b87949f3aa0aee737c" + }, + "cli": { + "Package": "cli", + "Version": "3.6.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.4.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "5a295d7d963cc5035284dcdbaf334f4e" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "methods", + "utils" + ], + "Hash": "e8a1e41acf02548751f45c718d55aa6a" + }, + "curl": { + "Package": "curl", + "Version": "5.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "ce88d13c0b10fe88a37d9c59dba2d7f9" + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "generics", + "glue", + "lifecycle", + "magrittr", + "methods", + "pillar", + "rlang", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" + }, + "ellipsis": { + "Package": "ellipsis", + "Version": "0.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "rlang" + ], + "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077" + }, + "fansi": { + "Package": "fansi", + "Version": "1.0.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "utils" + ], + "Hash": "962174cf2aeb5b9eea581522286a911f" + }, + "fastmap": { + "Package": "fastmap", + "Version": "1.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "f7736a18de97dea803bde0a2daaafb27" + }, + "generics": { + "Package": "generics", + "Version": "0.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "15e9634c0fcd294799e9b2e929ed1b86" + }, + "glue": { + "Package": "glue", + "Version": "1.7.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "e0b3a53876554bd45879e596cdb10a52" + }, + "hms": { + "Package": "hms", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "lifecycle", + "methods", + "pkgconfig", + "rlang", + "vctrs" + ], + "Hash": "b59377caa7ed00fa41808342002138f9" + }, + "httpuv": { + "Package": "httpuv", + "Version": "1.6.14", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "Rcpp", + "later", + "promises", + "utils" + ], + "Hash": "16abeb167dbf511f8cc0552efaf05bab" + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "1.8.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods" + ], + "Hash": "e1b9c55281c5adc4dd113652d9e26768" + }, + "later": { + "Package": "later", + "Version": "1.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Rcpp", + "rlang" + ], + "Hash": "a3e051d405326b8b0012377434c62b37" + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "rlang" + ], + "Hash": "b8552d117e1b808b09a832f589b79035" + }, + "lubridate": { + "Package": "lubridate", + "Version": "1.9.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "generics", + "methods", + "timechange" + ], + "Hash": "680ad542fbcf801442c83a6ac5a2126c" + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "7ce2733a9826b3aeb1775d56fd305472" + }, + "mime": { + "Package": "mime", + "Version": "0.12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tools" + ], + "Hash": "18e9c28c1d3ca1560ce30658b22ce104" + }, + "pillar": { + "Package": "pillar", + "Version": "1.9.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "fansi", + "glue", + "lifecycle", + "rlang", + "utf8", + "utils", + "vctrs" + ], + "Hash": "15da5a8412f317beeee6175fbc76f4bb" + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "01f28d4278f15c76cddbea05899c5d6f" + }, + "plogr": { + "Package": "plogr", + "Version": "0.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "09eb987710984fc2905c7129c7d85e65" + }, + "plumber": { + "Package": "plumber", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "crayon", + "ellipsis", + "httpuv", + "jsonlite", + "lifecycle", + "magrittr", + "mime", + "promises", + "rlang", + "sodium", + "stringi", + "swagger", + "webutils" + ], + "Hash": "8b65a7a00ef8edc5ddc6fabf0aff1194" + }, + "promises": { + "Package": "promises", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R6", + "Rcpp", + "fastmap", + "later", + "magrittr", + "rlang", + "stats" + ], + "Hash": "0d8a15c9d000970ada1ab21405387dee" + }, + "renv": { + "Package": "renv", + "Version": "1.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "41b847654f567341725473431dd0d5ab" + }, + "rlang": { + "Package": "rlang", + "Version": "1.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" + }, + "sodium": { + "Package": "sodium", + "Version": "1.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "dd86d6fd2a01d4eb3777dfdee7076d56" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats", + "tools", + "utils" + ], + "Hash": "058aebddea264f4c99401515182e656a" + }, + "swagger": { + "Package": "swagger", + "Version": "3.33.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "f28d25ed70c903922254157c11b0081d" + }, + "tibble": { + "Package": "tibble", + "Version": "3.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "fansi", + "lifecycle", + "magrittr", + "methods", + "pillar", + "pkgconfig", + "rlang", + "utils", + "vctrs" + ], + "Hash": "a84e2cc86d07289b3b6f5069df7a004c" + }, + "tidyselect": { + "Package": "tidyselect", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang", + "vctrs", + "withr" + ], + "Hash": "79540e5fcd9e0435af547d885f184fd5" + }, + "timechange": { + "Package": "timechange", + "Version": "0.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "c5f3c201b931cd6474d17d8700ccb1c8" + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "62b65c52671e6665f803ff02954446e9" + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.6.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang" + ], + "Hash": "c03fa420630029418f7e6da3667aac4a" + }, + "webutils": { + "Package": "webutils", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "curl", + "jsonlite" + ], + "Hash": "6a7f2a3084c7249d2f1466d6e4cc2e84" + }, + "withr": { + "Package": "withr", + "Version": "3.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics" + ], + "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + } + } +} From f35db885a3d2810e2bfb1670dbbfae3e7f2b12af Mon Sep 17 00:00:00 2001 From: bergalli Date: Sat, 17 Feb 2024 13:52:39 +0000 Subject: [PATCH 08/15] plumber local ok --- scripts/trisk_knative/{main.R => api.R} | 30 +- scripts/trisk_knative/readme.md | 25 ++ scripts/trisk_knative/renv.lock | 425 ++++++++++++++++++++++++ 3 files changed, 466 insertions(+), 14 deletions(-) rename scripts/trisk_knative/{main.R => api.R} (54%) create mode 100644 scripts/trisk_knative/readme.md diff --git a/scripts/trisk_knative/main.R b/scripts/trisk_knative/api.R similarity index 54% rename from scripts/trisk_knative/main.R rename to scripts/trisk_knative/api.R index d148af2..4abb399 100644 --- a/scripts/trisk_knative/main.R +++ b/scripts/trisk_knative/api.R @@ -4,7 +4,7 @@ source("./trisk_compute.R") # Create a plumber router -pr <- plumber::plumb() +pr <- plumber::Plumber$new() validate_trisk_run_params <- function(trisk_run_params) { required_keys <- names(formals(r2dii.climate.stress.test::run_trisk)) @@ -17,22 +17,22 @@ validate_trisk_run_params <- function(trisk_run_params) { pr$handle("POST", "/compute_trisk", function(req, res){ - trisk_run_param <- jsonlite::fromJSON(req$postBody) - trisk_run_params <- as.list(trisk_run_params) - trisk_input_path <- as.character(trisk_input_path) + trisk_run_params <- jsonlite::fromJSON(req$postBody)$trisk_run_params validate_trisk_run_params(trisk_run_params) - - trisk_input_path <- Sys.getenv("ST_TRISK_INPUT_PATH") - dbname <- Sys.getenv("ST_POSTGRES_DB") - host_db <- Sys.getenv("ST_POSTGRES_HOST") - db_port <- Sys.getenv("ST_POSTGRES_PORT") - db_user <- Sys.getenv("ST_POSTGRES_USERNAME") - db_password <- Sys.getenv("ST_POSTGRES_PASSWORD") - - postgres_conn <- DBI::dbConnect(RPostgres::Postgres(), dbname = dbname, host = host_db, port = db_port, user = db_user, password = db_password) + # hardcoded input fp while the data is still part of the docker image + trisk_input_path <- file.path(".", "st_inputs") + + postgres_conn <- DBI::dbConnect( + RPostgres::Postgres(), + dbname = Sys.getenv("ST_POSTGRES_DB"), + host = Sys.getenv("ST_POSTGRES_HOST"), + port = Sys.getenv("ST_POSTGRES_PORT"), + user = Sys.getenv("ST_POSTGRES_USERNAME"), + password = Sys.getenv("ST_POSTGRES_PASSWORD") + ) - run_trisk_and_upload_results_to_db_conn( + run_id <- run_trisk_and_upload_results_to_db_conn( trisk_run_params=trisk_run_params, trisk_input_path=trisk_input_path, postgres_conn=postgres_conn @@ -43,3 +43,5 @@ pr$handle("POST", "/compute_trisk", function(req, res){ # Run the plumber API on port 8080 pr$run(port=8080) + + diff --git a/scripts/trisk_knative/readme.md b/scripts/trisk_knative/readme.md new file mode 100644 index 0000000..751b373 --- /dev/null +++ b/scripts/trisk_knative/readme.md @@ -0,0 +1,25 @@ +to test api : + +in rconsole: + + source("api.R") + +in shell: + + curl -X 'POST' \ + 'http://0.0.0.0:8080/compute_trisk' \ + -H 'Content-Type: application/json' \ + -d '{ + "trisk_run_params": { + "baseline_scenario": "WEO2021_APS", + "shock_scenario": "WEO2021_SDS", + "scenario_geography": "Global", + "shock_year": 2025, + "discount_rate": 0.02, + "risk_free_rate": 0.01, + "growth_rate": 0.01, + "div_netprofit_prop_coef": 0.8, + "carbon_price_model": "no_carbon_tax", + "market_passthrough": 0 + } + }' \ No newline at end of file diff --git a/scripts/trisk_knative/renv.lock b/scripts/trisk_knative/renv.lock index b806ea6..378e8f6 100644 --- a/scripts/trisk_knative/renv.lock +++ b/scripts/trisk_knative/renv.lock @@ -20,6 +20,38 @@ ], "Hash": "164809cd72e1d5160b4cb3aa57f510fe" }, + "MASS": { + "Package": "MASS", + "Version": "7.3-60", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats", + "utils" + ], + "Hash": "a56a6365b3fa73293ea8d084be0d9bb0" + }, + "Matrix": { + "Package": "Matrix", + "Version": "1.6-1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "lattice", + "methods", + "stats", + "utils" + ], + "Hash": "cb6855ac711958ca734b75e631b2035d" + }, "R6": { "Package": "R6", "Version": "2.5.1", @@ -30,6 +62,16 @@ ], "Hash": "470851b6d5d0ac559e9d01bb352b4021" }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "45f0398006e83a5b10b72a90663d8d8c" + }, "RPostgres": { "Package": "RPostgres", "Version": "1.4.6", @@ -107,6 +149,30 @@ ], "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52" }, + "clipr": { + "Package": "clipr", + "Version": "0.8.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" + }, + "colorspace": { + "Package": "colorspace", + "Version": "2.1-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats" + ], + "Hash": "f20c47fd52fae58b4e377c37bb8c335b" + }, "cpp11": { "Package": "cpp11", "Version": "0.4.7", @@ -185,6 +251,13 @@ ], "Hash": "962174cf2aeb5b9eea581522286a911f" }, + "farver": { + "Package": "farver", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8106d78941f34855c440ddb946b8f7a5" + }, "fastmap": { "Package": "fastmap", "Version": "1.1.1", @@ -192,6 +265,17 @@ "Repository": "CRAN", "Hash": "f7736a18de97dea803bde0a2daaafb27" }, + "fs": { + "Package": "fs", + "Version": "1.6.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "47b5f30c720c23999b913a1a635cf0bb" + }, "generics": { "Package": "generics", "Version": "0.1.3", @@ -203,6 +287,31 @@ ], "Hash": "15e9634c0fcd294799e9b2e929ed1b86" }, + "ggplot2": { + "Package": "ggplot2", + "Version": "3.4.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "R", + "cli", + "glue", + "grDevices", + "grid", + "gtable", + "isoband", + "lifecycle", + "mgcv", + "rlang", + "scales", + "stats", + "tibble", + "vctrs", + "withr" + ], + "Hash": "313d31eff2274ecf4c1d3581db7241f9" + }, "glue": { "Package": "glue", "Version": "1.7.0", @@ -214,6 +323,21 @@ ], "Hash": "e0b3a53876554bd45879e596cdb10a52" }, + "gtable": { + "Package": "gtable", + "Version": "0.3.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "grid", + "lifecycle", + "rlang" + ], + "Hash": "b29cf3031f49b04ab9c852c912547eef" + }, "hms": { "Package": "hms", "Version": "1.1.3", @@ -243,6 +367,17 @@ ], "Hash": "16abeb167dbf511f8cc0552efaf05bab" }, + "isoband": { + "Package": "isoband", + "Version": "0.2.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grid", + "utils" + ], + "Hash": "0080607b4a1a7b28979aecef976d8bc2" + }, "jsonlite": { "Package": "jsonlite", "Version": "1.8.8", @@ -253,6 +388,17 @@ ], "Hash": "e1b9c55281c5adc4dd113652d9e26768" }, + "labeling": { + "Package": "labeling", + "Version": "0.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "graphics", + "stats" + ], + "Hash": "b64ec208ac5bc1852b285f665d6368b3" + }, "later": { "Package": "later", "Version": "1.3.2", @@ -264,6 +410,21 @@ ], "Hash": "a3e051d405326b8b0012377434c62b37" }, + "lattice": { + "Package": "lattice", + "Version": "0.21-8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "grid", + "stats", + "utils" + ], + "Hash": "0b8a6d63c8770f02a8b5635f3c431e6b" + }, "lifecycle": { "Package": "lifecycle", "Version": "1.0.4", @@ -300,6 +461,23 @@ ], "Hash": "7ce2733a9826b3aeb1775d56fd305472" }, + "mgcv": { + "Package": "mgcv", + "Version": "1.9-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "Matrix", + "R", + "graphics", + "methods", + "nlme", + "splines", + "stats", + "utils" + ], + "Hash": "086028ca0460d0c368028d3bda58f31b" + }, "mime": { "Package": "mime", "Version": "0.12", @@ -310,6 +488,31 @@ ], "Hash": "18e9c28c1d3ca1560ce30658b22ce104" }, + "munsell": { + "Package": "munsell", + "Version": "0.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "colorspace", + "methods" + ], + "Hash": "6dfe8bf774944bd5595785e3229d8771" + }, + "nlme": { + "Package": "nlme", + "Version": "3.1-163", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "graphics", + "lattice", + "stats", + "utils" + ], + "Hash": "8d1938040a05566f4f7a14af4feadd6b" + }, "pillar": { "Package": "pillar", "Version": "1.9.0", @@ -368,6 +571,30 @@ ], "Hash": "8b65a7a00ef8edc5ddc6fabf0aff1194" }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + }, + "progress": { + "Package": "progress", + "Version": "1.2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "crayon", + "hms", + "prettyunits" + ], + "Hash": "f4625e061cb2865f111b47ff163a5ca6" + }, "promises": { "Package": "promises", "Version": "1.2.1", @@ -384,6 +611,72 @@ ], "Hash": "0d8a15c9d000970ada1ab21405387dee" }, + "purrr": { + "Package": "purrr", + "Version": "1.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "lifecycle", + "magrittr", + "rlang", + "vctrs" + ], + "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc" + }, + "r2dii.climate.stress.test": { + "Package": "r2dii.climate.stress.test", + "Version": "0.0.0.9005", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteUsername": "2DegreesInvesting", + "RemoteRepo": "r2dii.climate.stress.test", + "RemoteRef": "master", + "RemoteSha": "053e9d06210ce295a9542ee4da8791c2e91859a5", + "Requirements": [ + "R", + "dplyr", + "fs", + "ggplot2", + "glue", + "magrittr", + "purrr", + "readr", + "rlang", + "tibble", + "tidyr", + "uuid", + "withr", + "zoo" + ], + "Hash": "68774ccb037087f5396116fb4a6d2495" + }, + "readr": { + "Package": "readr", + "Version": "2.1.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "clipr", + "cpp11", + "crayon", + "hms", + "lifecycle", + "methods", + "rlang", + "tibble", + "tzdb", + "utils", + "vroom" + ], + "Hash": "9de96463d2117f6ac49980577939dfb3" + }, "renv": { "Package": "renv", "Version": "1.0.3", @@ -405,6 +698,26 @@ ], "Hash": "42548638fae05fd9a9b5f3f437fbbbe2" }, + "scales": { + "Package": "scales", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "RColorBrewer", + "cli", + "farver", + "glue", + "labeling", + "lifecycle", + "munsell", + "rlang", + "viridisLite" + ], + "Hash": "c19df082ba346b0ffa6f833e92de34d1" + }, "sodium": { "Package": "sodium", "Version": "1.3.1", @@ -425,6 +738,23 @@ ], "Hash": "058aebddea264f4c99401515182e656a" }, + "stringr": { + "Package": "stringr", + "Version": "1.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "magrittr", + "rlang", + "stringi", + "vctrs" + ], + "Hash": "960e2ae9e09656611e0b8214ad543207" + }, "swagger": { "Package": "swagger", "Version": "3.33.1", @@ -451,6 +781,29 @@ ], "Hash": "a84e2cc86d07289b3b6f5069df7a004c" }, + "tidyr": { + "Package": "tidyr", + "Version": "1.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "cpp11", + "dplyr", + "glue", + "lifecycle", + "magrittr", + "purrr", + "rlang", + "stringr", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "915fb7ce036c22a6a33b5a8adb712eb1" + }, "tidyselect": { "Package": "tidyselect", "Version": "1.2.0", @@ -478,6 +831,17 @@ ], "Hash": "c5f3c201b931cd6474d17d8700ccb1c8" }, + "tzdb": { + "Package": "tzdb", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "f561504ec2897f4d46f0c7657e488ae1" + }, "utf8": { "Package": "utf8", "Version": "1.2.4", @@ -488,6 +852,16 @@ ], "Hash": "62b65c52671e6665f803ff02954446e9" }, + "uuid": { + "Package": "uuid", + "Version": "1.2-0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "303c19bfd970bece872f93a824e323d9" + }, "vctrs": { "Package": "vctrs", "Version": "0.6.5", @@ -502,6 +876,42 @@ ], "Hash": "c03fa420630029418f7e6da3667aac4a" }, + "viridisLite": { + "Package": "viridisLite", + "Version": "0.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" + }, + "vroom": { + "Package": "vroom", + "Version": "1.6.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit64", + "cli", + "cpp11", + "crayon", + "glue", + "hms", + "lifecycle", + "methods", + "progress", + "rlang", + "stats", + "tibble", + "tidyselect", + "tzdb", + "vctrs", + "withr" + ], + "Hash": "390f9315bc0025be03012054103d227c" + }, "webutils": { "Package": "webutils", "Version": "1.2.0", @@ -524,6 +934,21 @@ "graphics" ], "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35" + }, + "zoo": { + "Package": "zoo", + "Version": "1.8-12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "lattice", + "stats", + "utils" + ], + "Hash": "5c715954112b45499fb1dadc6ee6ee3e" } } } From dab8451e2a774b282e5ffb91333cced43da990ed Mon Sep 17 00:00:00 2001 From: bergalli Date: Sat, 17 Feb 2024 15:05:38 +0000 Subject: [PATCH 09/15] wips --- Dockerfile | 4 +-- app/main.R | 3 +-- scripts/creds.R | 5 ++++ scripts/trisk_knative/Dockerfile | 5 ++-- scripts/trisk_knative/api.R | 6 +++-- scripts/trisk_knative/app-service.yaml | 11 ++++++++ scripts/trisk_knative/readme.md | 36 ++++++++++++++++++++++++-- 7 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 scripts/creds.R create mode 100644 scripts/trisk_knative/app-service.yaml diff --git a/Dockerfile b/Dockerfile index 1bf1efa..4d1cb2a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,5 +28,5 @@ COPY --chown=shiny:shiny rhino.yml ./ COPY --chown=shiny:shiny app app/ COPY --chown=shiny:shiny docker/shiny-server.conf /etc/shiny-server/ -RUN mkdir -p /var/run/s6 && chown -R shiny:shiny /var/run/s6 -USER shiny \ No newline at end of file +# RUN mkdir -p /var/run/s6 && chown -R shiny:shiny /var/run/s6 +# USER shiny \ No newline at end of file diff --git a/app/main.R b/app/main.R index 40ee2f1..407350e 100644 --- a/app/main.R +++ b/app/main.R @@ -158,8 +158,7 @@ ui <- function(id) { #' @export server <- function(id) { moduleServer(id, function(input, output, session) { - print("CRISPY_APP_ENV") - print(Sys.getenv("CRISPY_APP_ENV")) + possible_trisk_combinations <- r2dii.climate.stress.test::get_scenario_geography_x_ald_sector(trisk_input_path) # the TRISK runs are generated In the sidebar module diff --git a/scripts/creds.R b/scripts/creds.R new file mode 100644 index 0000000..0f5362d --- /dev/null +++ b/scripts/creds.R @@ -0,0 +1,5 @@ +Sys.setenv(ST_POSTGRES_DB="defaultdb") +Sys.setenv(ST_POSTGRES_HOST="db-postgresql-st-inputs-do-user-15367886-0.c.db.ondigitalocean.com") +Sys.setenv(ST_POSTGRES_PORT="25060") +Sys.setenv(ST_POSTGRES_USERNAME="doadmin") +Sys.setenv(ST_POSTGRES_PASSWORD="AVNS_s2JaVyjqyVTRru4_3C4") \ No newline at end of file diff --git a/scripts/trisk_knative/Dockerfile b/scripts/trisk_knative/Dockerfile index 53c4070..947f46e 100644 --- a/scripts/trisk_knative/Dockerfile +++ b/scripts/trisk_knative/Dockerfile @@ -4,6 +4,7 @@ FROM rocker/r-ver:latest RUN apt-get update && apt-get install -y --no-install-recommends \ libcurl4-gnutls-dev \ libpq-dev \ + zlib1g-dev \ libsodium-dev # libssl-dev \ # libxml2-dev \ @@ -25,7 +26,7 @@ RUN Rscript -e 'renv::restore(clean = TRUE)' # Copy the R project files -COPY ./main.R /app/main.R +COPY ./api.R /app/api.R COPY ./trisk_compute.R /app/trisk_compute.R COPY ./st_inputs/* /app/st_inputs/ @@ -42,4 +43,4 @@ ENV ST_POSTGRES_PORT=NULL EXPOSE 8080 # Use plumber to run your app -CMD ["Rscript", "/app/main.R"] \ No newline at end of file +CMD ["Rscript", "/app/api.R"] \ No newline at end of file diff --git a/scripts/trisk_knative/api.R b/scripts/trisk_knative/api.R index 4abb399..7c49af1 100644 --- a/scripts/trisk_knative/api.R +++ b/scripts/trisk_knative/api.R @@ -38,10 +38,12 @@ pr$handle("POST", "/compute_trisk", function(req, res){ postgres_conn=postgres_conn ) - return(run_id) + response <- list(trisk_run_id=run_id) + response <- jsonlite::toJSON(response, auto_unbox = TRUE) + return(response) }) # Run the plumber API on port 8080 -pr$run(port=8080) +pr$run(port=8080, host="0.0.0.0") diff --git a/scripts/trisk_knative/app-service.yaml b/scripts/trisk_knative/app-service.yaml new file mode 100644 index 0000000..19e37b2 --- /dev/null +++ b/scripts/trisk_knative/app-service.yaml @@ -0,0 +1,11 @@ +apiVersion: serving.knative.dev/v1 +kind: Service +metadata: + name: trisk-api-service +spec: + template: + spec: + containers: + - image: registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest + ports: + - containerPort: 8080 diff --git a/scripts/trisk_knative/readme.md b/scripts/trisk_knative/readme.md index 751b373..f54f28f 100644 --- a/scripts/trisk_knative/readme.md +++ b/scripts/trisk_knative/readme.md @@ -1,4 +1,4 @@ -to test api : +# to test api : in rconsole: @@ -22,4 +22,36 @@ in shell: "carbon_price_model": "no_carbon_tax", "market_passthrough": 0 } - }' \ No newline at end of file + }' + + +# with docker + +start local server : + +docker run \ + -e ST_POSTGRES_USERNAME=$ST_POSTGRES_USERNAME \ + -e ST_POSTGRES_PASSWORD=$ST_POSTGRES_PASSWORD \ + -e ST_POSTGRES_HOST=$ST_POSTGRES_HOST \ + -e ST_POSTGRES_PORT=$ST_POSTGRES_PORT \ + -e ST_POSTGRES_DB=$ST_POSTGRES_DB \ + -p 8080:8080 registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest + + +curl -X 'POST' \ + 'http://0.0.0.0:8080/compute_trisk' \ + -H 'Content-Type: application/json' \ + -d '{ + "trisk_run_params": { + "baseline_scenario": "WEO2021_APS", + "shock_scenario": "WEO2021_SDS", + "scenario_geography": "Global", + "shock_year": 2025, + "discount_rate": 0.02, + "risk_free_rate": 0.01, + "growth_rate": 0.01, + "div_netprofit_prop_coef": 0.8, + "carbon_price_model": "no_carbon_tax", + "market_passthrough": 0 + } + }' From 490013f623404a5098b45e50817eacd27f25abab Mon Sep 17 00:00:00 2001 From: bergalli Date: Sat, 17 Feb 2024 15:33:37 +0000 Subject: [PATCH 10/15] wip --- scripts/trisk_knative/readme.md | 29 +++++++++++++++++++ ...pp-service.yaml => trisk-api-service.yaml} | 0 2 files changed, 29 insertions(+) rename scripts/trisk_knative/{app-service.yaml => trisk-api-service.yaml} (100%) diff --git a/scripts/trisk_knative/readme.md b/scripts/trisk_knative/readme.md index f54f28f..ffb7255 100644 --- a/scripts/trisk_knative/readme.md +++ b/scripts/trisk_knative/readme.md @@ -55,3 +55,32 @@ curl -X 'POST' \ "market_passthrough": 0 } }' + + +# Deploy and test deployment + +deploy: + kubectl apply -f trisk-api-service.yaml + +get service hostname: + kubectl get ksvc trisk-api-service -o=jsonpath='{.status.url}' + + +test api in vpc: + curl -X POST http://SERVICE-HOSTNAME -H "Host: SERVICE-HOSTNAME" -H "Content-Type: application/json" -d '{"key":"value"}' + +get external ip: + kubectl get svc -n kourier-system + +test api from the web : + curl -X POST http://EXTERNAL-IP -H "Host: SERVICE-HOSTNAME" -H "Content-Type: application/json" -d '{"key":"value"}' + + + +debug: + kubectl logs -l serving.knative.dev/service=trisk-api-service -c user-container -n default + + + + + diff --git a/scripts/trisk_knative/app-service.yaml b/scripts/trisk_knative/trisk-api-service.yaml similarity index 100% rename from scripts/trisk_knative/app-service.yaml rename to scripts/trisk_knative/trisk-api-service.yaml From d00316d65acf7f1847856db0f665bdcb1f4e2fc4 Mon Sep 17 00:00:00 2001 From: bergalli Date: Sat, 17 Feb 2024 17:20:31 +0000 Subject: [PATCH 11/15] ok knatives trisk --- .gitignore | 2667 ++++++++++++++++++ app/logic/cloud_logic.R | 9 +- scripts/trisk_knative/api.R | 2 + scripts/trisk_knative/config-domain.yaml | 7 + scripts/trisk_knative/db-credentials.yaml | 8 + scripts/trisk_knative/readme.md | 77 +- scripts/trisk_knative/trisk-api-service.yaml | 27 +- scripts/trisk_knative/trisk_compute.R | 2 +- yaml | 0 9 files changed, 2791 insertions(+), 8 deletions(-) create mode 100644 scripts/trisk_knative/config-domain.yaml create mode 100644 scripts/trisk_knative/db-credentials.yaml create mode 100644 yaml diff --git a/.gitignore b/.gitignore index 8e4dfa0..568c3a5 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,2670 @@ cypress.config.js package-lock.json scripts/trisk_k8s_api/st_inputs/* +scripts/trisk_knative/venv/lib64 +scripts/trisk_knative/venv/pyvenv.cfg +scripts/trisk_knative/venv/bin/activate +scripts/trisk_knative/venv/bin/activate.csh +scripts/trisk_knative/venv/bin/activate.fish +scripts/trisk_knative/venv/bin/Activate.ps1 +scripts/trisk_knative/venv/bin/pip +scripts/trisk_knative/venv/bin/pip3 +scripts/trisk_knative/venv/bin/pip3.11 +scripts/trisk_knative/venv/bin/pygmentize +scripts/trisk_knative/venv/bin/python +scripts/trisk_knative/venv/bin/python3 +scripts/trisk_knative/venv/bin/python3.11 +scripts/trisk_knative/venv/bin/radian +scripts/trisk_knative/venv/lib/python3.11/site-packages/_cffi_backend.cpython-311-x86_64-linux-gnu.so +scripts/trisk_knative/venv/lib/python3.11/site-packages/distutils-precedence.pth +scripts/trisk_knative/venv/lib/python3.11/site-packages/six.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/__pycache__/six.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/_distutils_hack/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/_distutils_hack/override.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/_cffi_errors.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/_cffi_include.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/_embedding.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/_imp_emulation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/_shimmed_dist_utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/api.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/backend_ctypes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/cffi_opcode.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/commontypes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/cparser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/error.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/ffiplatform.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/lock.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/model.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/parse_c_type.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/pkgconfig.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/recompiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/setuptools_ext.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/vengine_cpy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/vengine_gen.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/verifier.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/_imp_emulation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/_shimmed_dist_utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/api.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/backend_ctypes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/cffi_opcode.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/commontypes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/cparser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/error.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/ffiplatform.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/lock.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/model.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/pkgconfig.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/recompiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/setuptools_ext.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_cpy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/vengine_gen.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi/__pycache__/verifier.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi-1.16.0.dist-info/entry_points.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi-1.16.0.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi-1.16.0.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi-1.16.0.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi-1.16.0.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi-1.16.0.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/cffi-1.16.0.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/_elffile.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/_manylinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/_musllinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/_structures.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/_tokenizer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/markers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/metadata.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/py.typed +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/requirements.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/specifiers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/tags.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/_elffile.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/_manylinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/_musllinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/_structures.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/_tokenizer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/markers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/metadata.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/requirements.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/specifiers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/tags.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging-23.2.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging-23.2.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging-23.2.dist-info/LICENSE.APACHE +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging-23.2.dist-info/LICENSE.BSD +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging-23.2.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging-23.2.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/packaging-23.2.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/__pip-runner__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/py.typed +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/build_env.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cache.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/configuration.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/exceptions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/main.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/pyproject.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/self_outdated_check.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/wheel_builder.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/main.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/cache.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/check.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/completion.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/configuration.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/debug.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/download.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/freeze.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/hash.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/help.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/index.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/inspect.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/install.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/list.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/search.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/show.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/uninstall.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/installed.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/collector.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/package_finder.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/sources.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/_distutils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/_json.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/candidate.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/direct_url.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/format_control.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/index.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/installation_report.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/link.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/scheme.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/search_scope.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/target_python.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/auth.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/cache.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/download.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/session.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/check.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/freeze.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/prepare.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/constructors.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/req_file.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/req_install.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/req_set.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/_jaraco_text.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/_log.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/appdirs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/datetime.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/deprecation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/egg_link.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/encoding.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/filesystem.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/filetypes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/glibc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/hashes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/logging.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/misc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/models.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/packaging.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/setuptools_build.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/subprocess.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/unpacking.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/urls.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/git.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/subversion.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/six.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/typing_extensions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/vendor.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/certifi/cacert.pem +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/certifi/core.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/big5freq.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/big5prober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachinedict.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/enums.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/escprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/escsm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/johabprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/macromanprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/resultdict.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/win32.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansi_test.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/initialise_test.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/isatty_test.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/winterm_test.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/database.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/index.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/locators.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/markers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/metadata.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/resources.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distro/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distro/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distro/distro.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/codec.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/core.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/intranges.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/package_data.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__about__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/markers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/tags.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/cmdline.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/console.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/actions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/common.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/core.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/results.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/testing.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_fileno.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/json.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/layout.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/live.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/logging.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/markup.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/measure.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/padding.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/pager.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/palette.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/panel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/progress.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/region.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/repr.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/rule.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/scope.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/screen.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/segment.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/status.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/style.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/styled.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/table.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/text.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/theme.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/themes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/tree.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/after.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/before.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/nap.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/retry.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/wait.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/request.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/queue.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/labels.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/mklabels.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/tests.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/x_user_defined.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/AUTHORS.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/entry_points.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/LICENSE.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/REQUESTED +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/pip-23.2.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/typing_extensions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/typing_extensions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_elffile.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_tokenizer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/metadata.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/_tokenizer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/metadata.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/android.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/api.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/macos.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/unix.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/windows.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/android.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/api.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/extern/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/auto_suggest.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/buffer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/cache.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/cursor_shapes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/data_structures.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/document.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/enums.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/history.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/keys.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/log.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/mouse_events.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/patch_stdout.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/py.typed +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/renderer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/search.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/selection.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/token.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/validation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/win32_types.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/auto_suggest.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/buffer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/cache.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/cursor_shapes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/data_structures.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/document.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/enums.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/history.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/keys.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/log.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/mouse_events.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/patch_stdout.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/renderer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/search.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/selection.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/token.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/validation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/__pycache__/win32_types.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/application.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/current.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/dummy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/run_in_terminal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/__pycache__/application.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/__pycache__/current.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/__pycache__/dummy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/application/__pycache__/run_in_terminal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/in_memory.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/pyperclip.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/__pycache__/in_memory.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/clipboard/__pycache__/pyperclip.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/deduplicate.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/filesystem.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/fuzzy_completer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/nested.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/word_completer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__pycache__/deduplicate.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__pycache__/filesystem.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__pycache__/fuzzy_completer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__pycache__/nested.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/completion/__pycache__/word_completer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/completers/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/completers/system.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/completers/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/completers/__pycache__/system.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/compiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/completion.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/lexer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/regex_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/validation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/compiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/completion.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/lexer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/regex_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/validation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/ssh/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/ssh/server.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/ssh/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/ssh/__pycache__/server.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/log.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/protocol.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/server.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/__pycache__/log.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/__pycache__/protocol.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/__pycache__/server.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/async_generator.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/inputhook.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/win32.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/__pycache__/async_generator.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/__pycache__/inputhook.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/eventloop/__pycache__/win32.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/app.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/cli.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/__pycache__/app.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/__pycache__/cli.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/filters/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/ansi.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/html.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/pygments.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/__pycache__/ansi.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/__pycache__/html.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/__pycache__/pygments.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/formatted_text/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/ansi_escape_sequences.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/defaults.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/posix_pipe.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/posix_utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/typeahead.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/vt100_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/vt100.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/win32_pipe.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/win32.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/ansi_escape_sequences.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/defaults.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/posix_pipe.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/posix_utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/typeahead.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/vt100_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/vt100.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/win32_pipe.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/input/__pycache__/win32.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/defaults.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/digraphs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/emacs_state.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/key_bindings.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/key_processor.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/vi_state.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__pycache__/defaults.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__pycache__/digraphs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__pycache__/emacs_state.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__pycache__/key_bindings.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__pycache__/key_processor.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/__pycache__/vi_state.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/auto_suggest.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/basic.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/completion.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/cpr.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/emacs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/focus.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/mouse.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/named_commands.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/open_in_editor.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/page_navigation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/scroll.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/search.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/vi.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/auto_suggest.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/basic.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/completion.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/cpr.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/emacs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/focus.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/mouse.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/named_commands.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/open_in_editor.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/page_navigation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/scroll.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/search.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/vi.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/containers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/controls.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/dimension.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/dummy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/layout.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/margins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/menus.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/mouse_handlers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/processors.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/screen.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/scrollable_pane.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/containers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/controls.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/dimension.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/dummy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/layout.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/margins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/menus.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/mouse_handlers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/processors.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/screen.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/scrollable_pane.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/layout/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/lexers/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/lexers/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/lexers/pygments.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/lexers/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/lexers/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/lexers/__pycache__/pygments.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/color_depth.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/conemu.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/defaults.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/flush_stdout.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/plain_text.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/vt100.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/win32.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/windows10.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/color_depth.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/conemu.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/defaults.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/flush_stdout.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/plain_text.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/vt100.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/win32.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/output/__pycache__/windows10.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/dialogs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/prompt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/__pycache__/dialogs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/__pycache__/prompt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/progress_bar/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/progress_bar/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/progress_bar/formatters.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/formatters.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/defaults.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/named_colors.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/pygments.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/style_transformation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/style.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__pycache__/defaults.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__pycache__/named_colors.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__pycache__/pygments.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__pycache__/style_transformation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/styles/__pycache__/style.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/base.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/dialogs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/menus.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/toolbars.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/__pycache__/base.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/__pycache__/dialogs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/__pycache__/menus.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit/widgets/__pycache__/toolbars.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit-3.0.43.dist-info/AUTHORS.rst +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit-3.0.43.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit-3.0.43.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit-3.0.43.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit-3.0.43.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit-3.0.43.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/prompt_toolkit-3.0.43.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/_ast_gen.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/_build_tables.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/_c_ast.cfg +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ast_transforms.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/c_ast.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/c_generator.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/c_lexer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/c_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/lextab.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/plyparser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/yacctab.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/_ast_gen.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/_build_tables.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/ast_transforms.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/c_ast.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/c_generator.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/c_lexer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/c_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/lextab.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/plyparser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/__pycache__/yacctab.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/cpp.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/ctokens.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/lex.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/yacc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/ygen.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/__pycache__/cpp.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/__pycache__/ctokens.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/__pycache__/lex.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/__pycache__/yacc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser/ply/__pycache__/ygen.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser-2.21.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser-2.21.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser-2.21.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser-2.21.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser-2.21.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/pycparser-2.21.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/cmdline.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/console.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/filter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatter.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/modeline.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/plugin.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/regexopt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/scanner.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/sphinxext.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/style.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/token.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/unistring.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/cmdline.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/console.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/filter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/formatter.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/lexer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/modeline.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/plugin.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/regexopt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/scanner.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/sphinxext.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/style.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/token.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/unistring.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/__pycache__/util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/filters/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/filters/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/_mapping.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/bbcode.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/groff.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/html.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/img.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/irc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/latex.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/other.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/pangomarkup.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/rtf.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/svg.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/terminal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/terminal256.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/_mapping.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/bbcode.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/groff.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/html.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/img.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/irc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/latex.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/other.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/rtf.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/svg.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/terminal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/formatters/__pycache__/terminal256.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_ada_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_asy_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_cl_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_cocoa_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_csound_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_css_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_julia_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_lasso_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_lilypond_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_lua_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_mapping.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_mql_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_mysql_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_openedge_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_php_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_postgres_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_qlik_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_scheme_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_scilab_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_sourcemod_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_stan_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_stata_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_tsql_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_usd_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_vbscript_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/_vim_builtins.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/actionscript.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ada.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/agile.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/algebra.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ambient.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/amdgpu.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ampl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/apdlexer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/apl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/archetype.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/arrow.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/arturo.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/asc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/asm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/asn1.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/automation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/bare.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/basic.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/bdd.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/berry.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/bibtex.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/blueprint.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/boa.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/bqn.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/business.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/c_cpp.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/c_like.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/capnproto.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/carbon.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/cddl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/chapel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/clean.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/comal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/compiled.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/configs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/console.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/cplint.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/crystal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/csound.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/css.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/d.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/dalvik.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/data.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/dax.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/devicetree.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/diff.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/dns.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/dotnet.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/dsls.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/dylan.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ecl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/eiffel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/elm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/elpi.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/email.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/erlang.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/esoteric.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ezhil.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/factor.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/fantom.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/felix.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/fift.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/floscript.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/forth.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/fortran.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/foxpro.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/freefem.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/func.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/functional.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/futhark.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/gcodelexer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/gdscript.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/go.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/grammar_notation.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/graph.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/graphics.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/graphql.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/graphviz.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/gsql.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/haskell.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/haxe.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/hdl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/hexdump.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/html.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/idl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/igor.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/inferno.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/installers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/int_fiction.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/iolang.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/j.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/javascript.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/jmespath.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/jslt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/jsonnet.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/jsx.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/julia.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/jvm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/kuin.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/kusto.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ldap.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/lean.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/lilypond.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/lisp.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/macaulay2.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/make.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/markup.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/math.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/matlab.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/maxima.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/meson.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/mime.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/minecraft.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/mips.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ml.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/modeling.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/modula2.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/monte.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/mosel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ncl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/nimrod.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/nit.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/nix.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/oberon.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/objective.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ooc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/openscad.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/other.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/parasail.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/parsers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/pascal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/pawn.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/perl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/phix.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/php.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/pointless.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/pony.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/praat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/procfile.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/prolog.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/promql.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/prql.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ptx.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/python.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/q.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/qlik.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/qvt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/r.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/rdf.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/rebol.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/resource.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ride.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/rita.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/rnc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/roboconf.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/robotframework.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ruby.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/rust.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/sas.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/savi.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/scdoc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/scripting.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/sgf.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/shell.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/sieve.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/slash.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/smalltalk.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/smithy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/smv.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/snobol.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/solidity.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/sophia.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/special.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/spice.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/sql.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/srcinfo.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/stata.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/supercollider.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/tal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/tcl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/teal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/templates.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/teraterm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/testing.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/text.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/textedit.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/textfmts.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/theorem.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/thingsdb.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/tlb.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/tls.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/tnt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/trafficscript.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/typoscript.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/ul4.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/unicon.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/urbi.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/usd.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/varnish.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/verification.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/verifpal.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/vip.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/vyper.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/web.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/webassembly.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/webidl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/webmisc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/wgsl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/whiley.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/wowtoc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/wren.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/x10.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/xorg.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/yang.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/yara.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/zig.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_mapping.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_mysql_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_qlik_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/actionscript.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ada.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/agile.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/algebra.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ambient.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/amdgpu.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ampl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/apdlexer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/apl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/archetype.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/arrow.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/arturo.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/asc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/asm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/asn1.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/automation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/bare.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/basic.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/bdd.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/berry.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/bibtex.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/blueprint.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/boa.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/bqn.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/business.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/c_like.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/capnproto.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/carbon.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/cddl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/chapel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/clean.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/comal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/compiled.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/configs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/console.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/cplint.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/crystal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/csound.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/css.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/d.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/dalvik.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/data.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/dax.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/devicetree.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/diff.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/dns.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/dotnet.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/dsls.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/dylan.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ecl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/eiffel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/elm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/elpi.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/email.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/erlang.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/esoteric.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ezhil.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/factor.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/fantom.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/felix.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/fift.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/floscript.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/forth.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/fortran.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/foxpro.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/freefem.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/func.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/functional.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/futhark.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/gcodelexer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/gdscript.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/go.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/graph.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/graphics.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/graphql.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/graphviz.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/gsql.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/haskell.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/haxe.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/hdl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/hexdump.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/html.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/idl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/igor.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/inferno.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/installers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/iolang.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/j.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/javascript.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/jmespath.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/jslt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/jsonnet.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/jsx.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/julia.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/jvm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/kuin.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/kusto.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ldap.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/lean.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/lilypond.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/lisp.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/macaulay2.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/make.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/markup.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/math.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/matlab.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/maxima.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/meson.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/mime.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/minecraft.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/mips.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ml.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/modeling.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/modula2.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/monte.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/mosel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ncl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/nimrod.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/nit.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/nix.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/oberon.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/objective.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ooc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/openscad.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/other.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/parasail.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/parsers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/pascal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/pawn.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/perl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/phix.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/php.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/pointless.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/pony.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/praat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/procfile.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/prolog.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/promql.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/prql.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ptx.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/python.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/q.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/qlik.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/qvt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/r.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/rdf.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/rebol.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/resource.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ride.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/rita.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/rnc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/roboconf.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/robotframework.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ruby.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/rust.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/sas.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/savi.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/scdoc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/scripting.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/sgf.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/shell.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/sieve.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/slash.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/smithy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/smv.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/snobol.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/solidity.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/sophia.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/special.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/spice.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/sql.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/srcinfo.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/stata.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/supercollider.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/tal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/tcl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/teal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/templates.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/teraterm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/testing.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/text.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/textedit.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/textfmts.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/theorem.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/thingsdb.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/tlb.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/tls.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/tnt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/typoscript.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/ul4.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/unicon.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/urbi.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/usd.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/varnish.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/verification.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/verifpal.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/vip.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/vyper.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/web.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/webassembly.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/webidl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/webmisc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/wgsl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/whiley.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/wowtoc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/wren.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/x10.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/xorg.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/yang.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/yara.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/lexers/__pycache__/zig.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/_mapping.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/abap.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/algol_nu.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/algol.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/arduino.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/autumn.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/borland.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/bw.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/colorful.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/default.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/dracula.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/emacs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/friendly_grayscale.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/friendly.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/fruity.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/gh_dark.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/gruvbox.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/igor.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/inkpot.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/lightbulb.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/lilypond.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/lovelace.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/manni.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/material.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/monokai.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/murphy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/native.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/nord.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/onedark.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/paraiso_dark.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/paraiso_light.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/pastie.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/perldoc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/rainbow_dash.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/rrt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/sas.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/solarized.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/staroffice.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/stata_dark.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/stata_light.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/tango.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/trac.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/vim.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/vs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/xcode.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/zenburn.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/_mapping.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/abap.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/algol_nu.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/algol.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/arduino.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/autumn.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/borland.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/bw.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/colorful.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/default.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/dracula.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/emacs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/friendly_grayscale.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/friendly.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/fruity.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/gh_dark.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/gruvbox.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/igor.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/inkpot.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/lightbulb.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/lilypond.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/lovelace.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/manni.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/material.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/monokai.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/murphy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/native.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/nord.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/onedark.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/pastie.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/perldoc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/rrt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/sas.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/solarized.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/staroffice.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/stata_dark.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/stata_light.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/tango.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/trac.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/vim.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/vs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/xcode.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments/styles/__pycache__/zenburn.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments-2.17.2.dist-info/entry_points.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments-2.17.2.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments-2.17.2.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments-2.17.2.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments-2.17.2.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments-2.17.2.dist-info/licenses/AUTHORS +scripts/trisk_knative/venv/lib/python3.11/site-packages/pygments-2.17.2.dist-info/licenses/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__main__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/app.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/completion.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/console.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/dispatch.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/document.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/io.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/key_bindings.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lexer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/prompt_session.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/rutils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/settings.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/shell.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/__main__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/app.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/completion.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/console.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/dispatch.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/document.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/io.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/key_bindings.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/lexer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/prompt_session.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/rutils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/settings.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/__pycache__/shell.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/latex/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/latex/latex_symbols.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/latex/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/latex/__pycache__/latex_symbols.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/buffer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/history.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/prompt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/__pycache__/buffer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/__pycache__/history.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/lineedit/__pycache__/prompt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/reticulate/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/reticulate/config.R +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/reticulate/key_bindings.R +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian/reticulate/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/entry_points.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/REQUESTED +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/radian-0.6.12.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/_cffi.abi3.so +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/callbacks.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/completion.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/console.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/dispatch.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/interface.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/py_tools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/repl.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/setup.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/types.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/xptr.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/callbacks.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/completion.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/console.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/dispatch.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/interface.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/py_tools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/repl.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/setup.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/types.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/__pycache__/xptr.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/reticulate/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/reticulate/config.R +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/reticulate/path.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/reticulate/py_config.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/reticulate/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/reticulate/__pycache__/path.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/reticulate/__pycache__/py_config.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/gil.c +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/gil.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/libR.c +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/libR.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/parse.c +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/parse.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/process_events.c +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/process_events.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect/src/R.h +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect-0.4.6.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect-0.4.6.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect-0.4.6.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect-0.4.6.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect-0.4.6.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/rchitect-0.4.6.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_entry_points.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_imp.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_importlib.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_itertools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_normalization.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_path.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_reqs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/archive_util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/build_meta.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/cli-32.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/cli-64.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/cli-arm64.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/cli.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/dep_util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/depends.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/discovery.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/dist.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/errors.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/extension.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/glob.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/gui-32.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/gui-64.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/gui-arm64.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/gui.exe +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/installer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/launch.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/logging.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/monkey.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/msvc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/namespaces.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/package_index.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/py312compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/sandbox.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/script (dev).tmpl +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/script.tmpl +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/unicode_utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/warnings.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/windows_support.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/_normalization.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/_path.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/depends.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/dist.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/errors.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/extension.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/glob.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/installer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/launch.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/logging.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/py312compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/warnings.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/_collections.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/_functools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/_log.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/archive_util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/cmd.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/config.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/core.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/debug.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/dep_util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/dir_util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/dist.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/errors.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/extension.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/file_util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/filelist.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/log.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/py38compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/py39compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/spawn.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/text_file.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/util.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_log.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/build.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/check.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/clean.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/config.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/install.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/register.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/upload.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/zipp.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_py39compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_py39compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_elffile.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/_tokenizer.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/metadata.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/_tokenizer.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/metadata.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/alias.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/bdist_egg.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/bdist_rpm.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/build_clib.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/build_ext.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/build_py.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/build.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/develop.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/dist_info.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/easy_install.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/editable_wheel.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/egg_info.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/install_egg_info.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/install_lib.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/install_scripts.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/install.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/launcher manifest.xml +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/register.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/rotate.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/saveopts.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/sdist.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/setopt.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/test.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/upload_docs.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/upload.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/expand.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/setupcfg.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/extern/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/entry_points.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/REQUESTED +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/setuptools-68.1.2.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/six-1.16.0.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/six-1.16.0.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/six-1.16.0.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/six-1.16.0.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/six-1.16.0.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/six-1.16.0.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/__init__.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/table_vs16.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/table_wide.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/table_zero.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/unicode_versions.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/wcwidth.py +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/__pycache__/__init__.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/__pycache__/table_vs16.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/__pycache__/table_wide.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/__pycache__/table_zero.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/__pycache__/unicode_versions.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth/__pycache__/wcwidth.cpython-311.pyc +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth-0.2.13.dist-info/INSTALLER +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth-0.2.13.dist-info/LICENSE +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth-0.2.13.dist-info/METADATA +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth-0.2.13.dist-info/RECORD +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth-0.2.13.dist-info/top_level.txt +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth-0.2.13.dist-info/WHEEL +scripts/trisk_knative/venv/lib/python3.11/site-packages/wcwidth-0.2.13.dist-info/zip-safe +scripts/trisk_knative/renv/.gitignore +scripts/trisk_knative/renv/activate.R +scripts/trisk_knative/renv/settings.json +scripts/trisk_knative/st_inputs/abcd_stress_test_input.csv +scripts/trisk_knative/st_inputs/ngfs_carbon_price.csv +scripts/trisk_knative/st_inputs/prewrangled_capacity_factors.csv +scripts/trisk_knative/st_inputs/prewrangled_financial_data_stress_test.csv +scripts/trisk_knative/st_inputs/price_data_long.csv +scripts/trisk_knative/st_inputs/Scenarios_AnalysisInput.csv diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R index c718b22..3b0a0e0 100644 --- a/app/logic/cloud_logic.R +++ b/app/logic/cloud_logic.R @@ -9,12 +9,17 @@ trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint) { body <- list( trisk_run_params = trisk_run_params ) - # Convert the body to JSON body_json <- jsonlite::toJSON(body, auto_unbox = TRUE) + # Define the headers, including Host + headers <- c( + `Host` = paste0("trisk-api.default.",trisk_api_service), + `Content-Type` = "application/json" + ) + # Make the POST request with a 6-minute timeout - response <- httr::POST(url, body = body_json, httr::add_headers(`Content-Type` = "application/json"), httr::timeout(360)) + response <- httr::POST(url, body = body_json, httr::add_headers(.headers = headers), httr::timeout(360)) # Check the response status_code <- httr::status_code(response) diff --git a/scripts/trisk_knative/api.R b/scripts/trisk_knative/api.R index 7c49af1..1a4abc2 100644 --- a/scripts/trisk_knative/api.R +++ b/scripts/trisk_knative/api.R @@ -38,6 +38,8 @@ pr$handle("POST", "/compute_trisk", function(req, res){ postgres_conn=postgres_conn ) + print("TRISK run & upload complete") + response <- list(trisk_run_id=run_id) response <- jsonlite::toJSON(response, auto_unbox = TRUE) return(response) diff --git a/scripts/trisk_knative/config-domain.yaml b/scripts/trisk_knative/config-domain.yaml new file mode 100644 index 0000000..77f7f83 --- /dev/null +++ b/scripts/trisk_knative/config-domain.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-domain + namespace: knative-serving +data: + 159.223.251.127: "" diff --git a/scripts/trisk_knative/db-credentials.yaml b/scripts/trisk_knative/db-credentials.yaml new file mode 100644 index 0000000..e2f0534 --- /dev/null +++ b/scripts/trisk_knative/db-credentials.yaml @@ -0,0 +1,8 @@ +# db-credentials.yaml +apiVersion: v1 +kind: Secret +metadata: + name: db-credentials +type: Opaque +data: + postgres_password: QVZOU19zMkphVnlqcXlWVFJydTRfM0M0 \ No newline at end of file diff --git a/scripts/trisk_knative/readme.md b/scripts/trisk_knative/readme.md index ffb7255..35e3375 100644 --- a/scripts/trisk_knative/readme.md +++ b/scripts/trisk_knative/readme.md @@ -63,7 +63,7 @@ deploy: kubectl apply -f trisk-api-service.yaml get service hostname: - kubectl get ksvc trisk-api-service -o=jsonpath='{.status.url}' + kubectl get ksvc trisk-api -o=jsonpath='{.status.url}' test api in vpc: @@ -83,4 +83,79 @@ debug: +# DEPLOY +https://docs.digitalocean.com/products/kubernetes/how-to/set-up-autoscaling/ + +docker push registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest + +## kubectl commands + +kubectl get pods + + +kubectl logs + + +kubectl apply -f app-deployment.yaml +kubectl apply -f app-service.yaml + +kubectl autoscale deployment trisk-api --cpu-percent=50 --min=2 --max=10 +kubectl get hpa + + + +kubectl get svc +kubectl get deployment + + +kubectl rollout restart deployment + +kubectl delete deployment + + +# To create db-credentials.yaml + + +echo -n DB_PASSWORD | base64 + +kubectl apply -f db-credentials.yaml + + + + + +### test internally: +kubectl run curl --image=curlimages/curl --restart=Never --rm -ti -- -v -X POST http://trisk-api.default.svc.cluster.local/compute_trisk -H 'Content-Type: application/json' -d '{ + "trisk_run_params": { + "baseline_scenario": "WEO2021_APS", + "shock_scenario": "WEO2021_SDS", + "scenario_geography": "Global", + "shock_year": 2025, + "discount_rate": 0.02, + "risk_free_rate": 0.01, + "growth_rate": 0.01, + "div_netprofit_prop_coef": 0.8, + "carbon_price_model": "no_carbon_tax", + "market_passthrough": 0 + } + }' + + +curl -v -X POST 'http://159.223.251.127/compute_trisk' \ + -H 'Host: trisk-api.default.159.223.251.127' \ + -H 'Content-Type: application/json' \ + -d '{ + "trisk_run_params": { + "baseline_scenario": "WEO2021_APS", + "shock_scenario": "WEO2021_SDS", + "scenario_geography": "Global", + "shock_year": 2025, + "discount_rate": 0.02, + "risk_free_rate": 0.01, + "growth_rate": 0.01, + "div_netprofit_prop_coef": 0.8, + "carbon_price_model": "no_carbon_tax", + "market_passthrough": 0 + } + }' \ No newline at end of file diff --git a/scripts/trisk_knative/trisk-api-service.yaml b/scripts/trisk_knative/trisk-api-service.yaml index 19e37b2..6e37d65 100644 --- a/scripts/trisk_knative/trisk-api-service.yaml +++ b/scripts/trisk_knative/trisk-api-service.yaml @@ -1,11 +1,30 @@ apiVersion: serving.knative.dev/v1 kind: Service metadata: - name: trisk-api-service + name: trisk-api spec: template: + metadata: + name: trisk-api-service spec: containers: - - image: registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest - ports: - - containerPort: 8080 + - image: registry.digitalocean.com/theia-1in1000-shinyapps/trisk_api:latest + ports: + - containerPort: 8080 + env: + - name: TARGET + value: "World" + - name: ST_POSTGRES_USERNAME + value: "doadmin" + - name: ST_POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: db-credentials + key: postgres_password + - name: ST_POSTGRES_HOST + value: "db-postgresql-st-inputs-do-user-15367886-0.c.db.ondigitalocean.com" + - name: ST_POSTGRES_PORT + value: "25060" + - name: ST_POSTGRES_DB + value: "defaultdb" + diff --git a/scripts/trisk_knative/trisk_compute.R b/scripts/trisk_knative/trisk_compute.R index d9bd9f2..f0903fc 100644 --- a/scripts/trisk_knative/trisk_compute.R +++ b/scripts/trisk_knative/trisk_compute.R @@ -72,7 +72,7 @@ run_trisk_with_params <- function(trisk_run_params, trisk_input_path) { # postgres_conn is a DBI connection # postgres_conn <- DBI::dbConnect(RPostgres::Postgres(), dbname = dbname, host = host_db, port = db_port, user = db_user, password = db_password) upload_to_postgres <- function(postgres_conn, st_results_wrangled_and_checked) { - + cat("Uploading results") # Iterate over the names of the results for (st_output_name in names(st_results_wrangled_and_checked)) { # Get the new data from the results diff --git a/yaml b/yaml new file mode 100644 index 0000000..e69de29 From 738bd55a62740bac373749c4e6359013e52872dd Mon Sep 17 00:00:00 2001 From: bertrand Date: Sat, 17 Feb 2024 18:33:21 +0100 Subject: [PATCH 12/15] fixes --- app/logic/cloud_logic.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R index 3b0a0e0..760d413 100644 --- a/app/logic/cloud_logic.R +++ b/app/logic/cloud_logic.R @@ -29,7 +29,8 @@ trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint) { } content <- httr::content(response, "text", encoding = "UTF-8") - run_id <- jsonlite::fromJSON(content)$trisk_run_id + # jsonlite::fromJSON has to be doubled bc of this content structure + run_id <- jsonlite::fromJSON(jsonlite::fromJSON(content)$trisk_run_id) return(run_id) } From 379e348240a8e905d6c646812d4e4581b2cdf38a Mon Sep 17 00:00:00 2001 From: bertrand Date: Sat, 17 Feb 2024 18:41:06 +0100 Subject: [PATCH 13/15] final fix --- app/logic/cloud_logic.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R index 760d413..0118a00 100644 --- a/app/logic/cloud_logic.R +++ b/app/logic/cloud_logic.R @@ -30,7 +30,7 @@ trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint) { content <- httr::content(response, "text", encoding = "UTF-8") # jsonlite::fromJSON has to be doubled bc of this content structure - run_id <- jsonlite::fromJSON(jsonlite::fromJSON(content)$trisk_run_id) + run_id <- jsonlite::fromJSON(jsonlite::fromJSON(content))$trisk_run_id return(run_id) } From 6a66cdeeabeeb75337614e9b8448a2053b87a971 Mon Sep 17 00:00:00 2001 From: bertrand Date: Tue, 20 Feb 2024 15:38:00 +0100 Subject: [PATCH 14/15] pass main test disabled other tests formatted code --- .Rprofile | 6 + app/logic/cloud_logic.R | 2 +- app/logic/constant.R | 5 +- app/logic/data_load.R | 10 +- app/logic/data_write.R | 7 +- app/logic/plots/exposure_change_plot.R | 2 +- app/logic/trisk_button_logic.R | 13 +- app/logic/trisk_mgmt.R | 24 +- app/main.R | 11 +- app/view/crispy_equities.R | 8 +- app/view/crispy_loans.R | 4 +- app/view/modules/plots_equity_change.R | 4 +- app/view/modules/plots_trajectories.R | 2 +- app/view/modules/trisk_button.R | 7 +- app/view/params/params_dimensions.R | 2 +- app/view/params/params_scenarios.R | 2 +- app/view/params/params_trisk.R | 2 +- app/view/portfolio/portfolio_analysis.R | 6 +- app/view/portfolio/portfolio_edition.R | 2 +- app/view/sidebar_parameters.R | 10 +- scripts/creds.R | 10 +- scripts/trisk_k8s_api/renv/activate.R | 673 ++++++++++++------------ scripts/trisk_k8s_api/trisk_compute.R | 2 - tests/testthat/test-main.R | 3 +- tests/testthat/test-trisk_mgmt.R | 336 ++++++------ 25 files changed, 560 insertions(+), 593 deletions(-) diff --git a/.Rprofile b/.Rprofile index 3b081a1..383ff22 100644 --- a/.Rprofile +++ b/.Rprofile @@ -7,3 +7,9 @@ if (file.exists("renv")) { # Allow absolute module imports (relative to the app root). options(box.path = getwd()) + + +Sys.setenv(TRISK_INPUT_PATH = file.path("app", "data", "st_inputs")) +Sys.setenv(TRISK_OUTPUT_PATH = file.path("app", "data", "backend_db")) +# 'prod' or 'dev' +Sys.setenv(CRISPY_APP_ENV = "dev") diff --git a/app/logic/cloud_logic.R b/app/logic/cloud_logic.R index 0118a00..a0a08f3 100644 --- a/app/logic/cloud_logic.R +++ b/app/logic/cloud_logic.R @@ -14,7 +14,7 @@ trigger_trisk_api_computation <- function(trisk_run_params, api_endpoint) { # Define the headers, including Host headers <- c( - `Host` = paste0("trisk-api.default.",trisk_api_service), + `Host` = paste0("trisk-api.default.", trisk_api_service), `Content-Type` = "application/json" ) diff --git a/app/logic/constant.R b/app/logic/constant.R index 9f3e330..93e4025 100644 --- a/app/logic/constant.R +++ b/app/logic/constant.R @@ -2,11 +2,10 @@ # ENV CONSTANTS ==================================== -trisk_input_path <- file.path("app", "data", "st_inputs") -backend_trisk_run_folder <- file.path("app", "data", "backend_db") +trisk_input_path <- Sys.getenv("TRISK_INPUT_PATH") +backend_trisk_run_folder <- Sys.getenv("TRISK_OUTPUT_PATH") api_endpoint <- Sys.getenv("TRISK_API_ENDPOINT") - # PROJECT CONSTANTS ==================================== # Must be ordered from "less granular" to "more granular" diff --git a/app/logic/data_load.R b/app/logic/data_load.R index 1573542..df65756 100644 --- a/app/logic/data_load.R +++ b/app/logic/data_load.R @@ -1,5 +1,5 @@ box::use( - app / logic / cloud_logic[ + app/logic/cloud_logic[ get_data_from_postgres ] ) @@ -8,8 +8,12 @@ base_data_load <- function(table_name, run_id = NULL, backend_trisk_run_folder = if (Sys.getenv("CRISPY_APP_ENV") == "dev") { table_data_path <- fs::path(backend_trisk_run_folder, table_name, ext = "parquet") if (file.exists(table_data_path)) { - table_data <- arrow::read_parquet(table_data_path) |> - dplyr::filter(.data$run_id == run_id) + if (!is.null(run_id)) { + table_data <- arrow::read_parquet(table_data_path) |> + dplyr::filter(.data$run_id == .env$run_id) + } else { + table_data <- arrow::read_parquet(table_data_path) + } } else { table_data <- default_tibble } diff --git a/app/logic/data_write.R b/app/logic/data_write.R index d669270..dee222c 100644 --- a/app/logic/data_write.R +++ b/app/logic/data_write.R @@ -26,16 +26,15 @@ append_st_results_to_backend_data <- function( # If the file exists, read the existing data, otherwise set the existing data to NULL if (file.exists(fpath)) { - persistent_data <- read_parquet(fpath) + persistent_data <- arrow::read_parquet(fpath) } else { persistent_data <- NULL } # Append the new data to the existing data - persistent_data <- bind_rows(persistent_data, new_data) + persistent_data <- dplyr::bind_rows(persistent_data, new_data) # Write the updated data back to the file - write_parquet(persistent_data, fpath) + arrow::write_parquet(persistent_data, fpath) } - return(run_id) } diff --git a/app/logic/plots/exposure_change_plot.R b/app/logic/plots/exposure_change_plot.R index 981d6b0..77f0e94 100644 --- a/app/logic/plots/exposure_change_plot.R +++ b/app/logic/plots/exposure_change_plot.R @@ -55,7 +55,7 @@ draw_exposure_change_plot <- function( geom_col(aes(y = !!rlang::sym(y_exposure_var)), width = bar_width, fill = plot_bar_color) + geom_tile( aes( - y = !!rlang::sym(y_exposure_var) + (!!rlang::sym(y_value_loss_var) / 2), + y = !!rlang::sym(y_exposure_var) + (!!rlang::sym(y_value_loss_var)/2), height = abs(!!rlang::sym(y_value_loss_var)), fill = dplyr::if_else(!!rlang::sym(y_value_loss_var) < 0, "Loss", "Gain") ), diff --git a/app/logic/trisk_button_logic.R b/app/logic/trisk_button_logic.R index 3ee5aa7..b89f401 100644 --- a/app/logic/trisk_button_logic.R +++ b/app/logic/trisk_button_logic.R @@ -1,14 +1,15 @@ box::use( - app / logic / trisk_mgmt[ - run_trisk_with_params + app/logic/trisk_mgmt[ + run_trisk_with_params, + format_error_message ], - app / logic / cloud_logic[ + app/logic/cloud_logic[ trigger_trisk_api_computation, ], - app / logic / data_load[ + app/logic/data_load[ load_backend_trisk_run_metadata ], - app / logic / data_write[ + app/logic/data_write[ append_st_results_to_backend_data ] ) @@ -70,6 +71,8 @@ trisk_generator <- function( max_trisk_granularity ) run_id <- check_if_run_exists(trisk_run_params, backend_trisk_run_folder) + } else { + run_id <- NULL } } else if (Sys.getenv("CRISPY_APP_ENV") == "prod") { run_id <- trigger_trisk_api_computation(trisk_run_params) diff --git a/app/logic/trisk_mgmt.R b/app/logic/trisk_mgmt.R index a97e0da..6179edc 100644 --- a/app/logic/trisk_mgmt.R +++ b/app/logic/trisk_mgmt.R @@ -1,32 +1,10 @@ -# Import necessary libraries and functions -box::use( - arrow[read_parquet, write_parquet], - dplyr[bind_rows], - r2dii.climate.stress.test[run_trisk], - app / logic / data_load[load_backend_crispy_data, load_backend_trajectories_data, load_backend_trisk_run_metadata] -) - - -box::use( - app / logic / trisk_mgmt[ - run_trisk_with_params, - format_error_message - ], - app / logic / data_load[ - load_backend_trajectories_data, - load_backend_crispy_data - ] -) - - - # Function to run the trisk model with given parameters and input path # Returns the wrangled and checked results run_trisk_with_params <- function(trisk_run_params, trisk_input_path) { # Run the trisk model with the provided parameters and input path # The results are returned and stored in st_results_wrangled_and_checked st_results_wrangled_and_checked <- do.call( - run_trisk, + r2dii.climate.stress.test::run_trisk, c( trisk_run_params, list( diff --git a/app/main.R b/app/main.R index 407350e..d6fce50 100644 --- a/app/main.R +++ b/app/main.R @@ -10,12 +10,12 @@ box::use( # Load required modules and logic files box::use( # modules - app / view / sidebar_parameters, - app / view / homepage, - app / view / crispy_equities, - app / view / crispy_loans, + app/view/sidebar_parameters, + app/view/homepage, + app/view/crispy_equities, + app/view/crispy_loans, # logic - app / logic / constant[ + app/logic/constant[ trisk_input_path, backend_trisk_run_folder, max_trisk_granularity, @@ -158,7 +158,6 @@ ui <- function(id) { #' @export server <- function(id) { moduleServer(id, function(input, output, session) { - possible_trisk_combinations <- r2dii.climate.stress.test::get_scenario_geography_x_ald_sector(trisk_input_path) # the TRISK runs are generated In the sidebar module diff --git a/app/view/crispy_equities.R b/app/view/crispy_equities.R index 7799340..4a5f702 100644 --- a/app/view/crispy_equities.R +++ b/app/view/crispy_equities.R @@ -8,10 +8,10 @@ box::use( ) box::use( - app / view / modules / trisk_button, - app / view / portfolio / portfolio_analysis, - app / view / modules / plots_equity_change, - app / view / modules / plots_trajectories, + app/view/modules/trisk_button, + app/view/portfolio/portfolio_analysis, + app/view/modules/plots_equity_change, + app/view/modules/plots_trajectories, ) ####### UI diff --git a/app/view/crispy_loans.R b/app/view/crispy_loans.R index f99131d..dd4a8a4 100644 --- a/app/view/crispy_loans.R +++ b/app/view/crispy_loans.R @@ -7,8 +7,8 @@ box::use( ) box::use( - app / view / modules / trisk_button, - app / view / portfolio / portfolio_analysis + app/view/modules/trisk_button, + app/view/portfolio/portfolio_analysis ) diff --git a/app/view/modules/plots_equity_change.R b/app/view/modules/plots_equity_change.R index b6c1543..170794b 100644 --- a/app/view/modules/plots_equity_change.R +++ b/app/view/modules/plots_equity_change.R @@ -4,8 +4,8 @@ box::use( ) box::use( - app / logic / plots / exposure_change_plot[pipeline_exposure_change_plot], - app / logic / plots / crispy_npv_change_plot[pipeline_crispy_npv_change_plot] + app/logic/plots/exposure_change_plot[pipeline_exposure_change_plot], + app/logic/plots/crispy_npv_change_plot[pipeline_crispy_npv_change_plot] ) diff --git a/app/view/modules/plots_trajectories.R b/app/view/modules/plots_trajectories.R index c47f3e2..debd8ed 100644 --- a/app/view/modules/plots_trajectories.R +++ b/app/view/modules/plots_trajectories.R @@ -4,7 +4,7 @@ box::use( ) box::use( - app / logic / plots / scenario_time_plot[pipeline_scenario_time_plot] + app/logic/plots/scenario_time_plot[pipeline_scenario_time_plot] ) diff --git a/app/view/modules/trisk_button.R b/app/view/modules/trisk_button.R index 8a5b869..f8a04be 100644 --- a/app/view/modules/trisk_button.R +++ b/app/view/modules/trisk_button.R @@ -7,11 +7,11 @@ box::use( ) box::use( - app / logic / trisk_button_logic[ + app/logic/trisk_button_logic[ trisk_generator, check_if_run_exists ], - app / logic / data_load[ + app/logic/data_load[ load_backend_crispy_data, load_backend_trajectories_data ] @@ -92,7 +92,7 @@ server <- function( # open the model dialog shinyjs::runjs( paste0( - "$('#", session$ns("mymodal"), "').modal({closable: true}).modal('show');" + "$('#", session$ns("mymodal"), "').modal({closable: false}).modal('show');" ) ) @@ -177,7 +177,6 @@ fetch_crispy_and_trajectories_data <- function(session, backend_trisk_run_folder observe({ if (!is.null(trisk_granularity_r()) & !is.null(raw_crispy_data_r()) & !is.null(raw_trajectories_data_r())) { - crispy_data_r( raw_crispy_data_r() |> stress.test.plot.report::main_load_multi_crispy_data(granularity = trisk_granularity_r()) diff --git a/app/view/params/params_dimensions.R b/app/view/params/params_dimensions.R index 6176951..100c25a 100644 --- a/app/view/params/params_dimensions.R +++ b/app/view/params/params_dimensions.R @@ -9,7 +9,7 @@ box::use( ) box::use( - app / logic / renamings[rename_string_vector] + app/logic/renamings[rename_string_vector] ) diff --git a/app/view/params/params_scenarios.R b/app/view/params/params_scenarios.R index 7670109..874014d 100644 --- a/app/view/params/params_scenarios.R +++ b/app/view/params/params_scenarios.R @@ -9,7 +9,7 @@ box::use( ) box::use( - app / logic / renamings[rename_string_vector] + app/logic/renamings[rename_string_vector] ) ui <- function(id) { diff --git a/app/view/params/params_trisk.R b/app/view/params/params_trisk.R index 8c2dd96..446e011 100644 --- a/app/view/params/params_trisk.R +++ b/app/view/params/params_trisk.R @@ -9,7 +9,7 @@ box::use( ) box::use( - app / logic / renamings[rename_string_vector] + app/logic/renamings[rename_string_vector] ) diff --git a/app/view/portfolio/portfolio_analysis.R b/app/view/portfolio/portfolio_analysis.R index 1e8cfc0..8912e8c 100644 --- a/app/view/portfolio/portfolio_analysis.R +++ b/app/view/portfolio/portfolio_analysis.R @@ -11,9 +11,9 @@ box::use( ) box::use( - app / view / portfolio / portfolio_edition, - app / logic / constant[max_trisk_granularity], - app / logic / renamings[rename_tibble_columns] + app/view/portfolio/portfolio_edition, + app/logic/constant[max_trisk_granularity], + app/logic/renamings[rename_tibble_columns] ) diff --git a/app/view/portfolio/portfolio_edition.R b/app/view/portfolio/portfolio_edition.R index a1b4179..b573c8d 100644 --- a/app/view/portfolio/portfolio_edition.R +++ b/app/view/portfolio/portfolio_edition.R @@ -11,7 +11,7 @@ box::use( ) box::use( - app / view / portfolio / simple_search_dropdown + app/view/portfolio/simple_search_dropdown ) diff --git a/app/view/sidebar_parameters.R b/app/view/sidebar_parameters.R index 9127a05..f1176b8 100644 --- a/app/view/sidebar_parameters.R +++ b/app/view/sidebar_parameters.R @@ -9,10 +9,10 @@ box::use( ) box::use( - app / view / params / params_scenarios, - app / view / params / params_dimensions, - app / view / params / params_trisk, - app / logic / renamings[rename_string_vector] + app/view/params/params_scenarios, + app/view/params/params_dimensions, + app/view/params/params_trisk, + app/logic/renamings[rename_string_vector] ) @@ -76,8 +76,6 @@ server <- function(id, backend_trisk_run_folder, market_passthrough = trisk_config_r()$market_passthrough ) }) - # prevent the UI modal from updating too often (ie. blinking) - # trisk_run_params_r <- shiny::throttle(trisk_run_params_r, millis = 200) perimeter <- list( "trisk_granularity_r" = trisk_granularity_r, diff --git a/scripts/creds.R b/scripts/creds.R index 0f5362d..677a30f 100644 --- a/scripts/creds.R +++ b/scripts/creds.R @@ -1,5 +1,5 @@ -Sys.setenv(ST_POSTGRES_DB="defaultdb") -Sys.setenv(ST_POSTGRES_HOST="db-postgresql-st-inputs-do-user-15367886-0.c.db.ondigitalocean.com") -Sys.setenv(ST_POSTGRES_PORT="25060") -Sys.setenv(ST_POSTGRES_USERNAME="doadmin") -Sys.setenv(ST_POSTGRES_PASSWORD="AVNS_s2JaVyjqyVTRru4_3C4") \ No newline at end of file +Sys.setenv(ST_POSTGRES_DB = "defaultdb") +Sys.setenv(ST_POSTGRES_HOST = "db-postgresql-st-inputs-do-user-15367886-0.c.db.ondigitalocean.com") +Sys.setenv(ST_POSTGRES_PORT = "25060") +Sys.setenv(ST_POSTGRES_USERNAME = "doadmin") +Sys.setenv(ST_POSTGRES_PASSWORD = "AVNS_s2JaVyjqyVTRru4_3C4") diff --git a/scripts/trisk_k8s_api/renv/activate.R b/scripts/trisk_k8s_api/renv/activate.R index a8fdc32..8744041 100644 --- a/scripts/trisk_k8s_api/renv/activate.R +++ b/scripts/trisk_k8s_api/renv/activate.R @@ -1,6 +1,4 @@ - local({ - # the requested version of renv version <- "0.17.3" @@ -9,11 +7,11 @@ local({ # figure out whether the autoloader is enabled enabled <- local({ - # first, check config option override <- getOption("renv.config.autoloader.enabled") - if (!is.null(override)) + if (!is.null(override)) { return(override) + } # next, check environment variables # TODO: prefer using the configuration one in the future @@ -25,17 +23,18 @@ local({ for (envvar in envvars) { envval <- Sys.getenv(envvar, unset = NA) - if (!is.na(envval)) + if (!is.na(envval)) { return(tolower(envval) %in% c("true", "t", "1")) + } } # enable by default TRUE - }) - if (!enabled) + if (!enabled) { return(FALSE) + } # avoid recursion if (identical(getOption("renv.autoloader.running"), TRUE)) { @@ -55,243 +54,244 @@ local({ library(utils, lib.loc = .Library) # unload renv if it's already been loaded - if ("renv" %in% loadedNamespaces()) + if ("renv" %in% loadedNamespaces()) { unloadNamespace("renv") + } - # load bootstrap tools + # load bootstrap tools `%||%` <- function(x, y) { if (is.environment(x) || length(x)) x else y } - + `%??%` <- function(x, y) { if (is.null(x)) y else x } - + bootstrap <- function(version, library) { - # attempt to download renv tarball <- tryCatch(renv_bootstrap_download(version), error = identity) - if (inherits(tarball, "error")) + if (inherits(tarball, "error")) { stop("failed to download renv ", version) - + } + # now attempt to install status <- tryCatch(renv_bootstrap_install(version, tarball, library), error = identity) - if (inherits(status, "error")) + if (inherits(status, "error")) { stop("failed to install renv ", version) - + } } - + renv_bootstrap_tests_running <- function() { getOption("renv.tests.running", default = FALSE) } - + renv_bootstrap_repos <- function() { - # get CRAN repository cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") - + # check for repos override repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) if (!is.na(repos)) { - # check for RSPM; if set, use a fallback repository for renv rspm <- Sys.getenv("RSPM", unset = NA) - if (identical(rspm, repos)) + if (identical(rspm, repos)) { repos <- c(RSPM = rspm, CRAN = cran) - + } + return(repos) - } - + # check for lockfile repositories repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) - if (!inherits(repos, "error") && length(repos)) + if (!inherits(repos, "error") && length(repos)) { return(repos) - + } + # if we're testing, re-use the test repositories if (renv_bootstrap_tests_running()) { repos <- getOption("renv.tests.repos") - if (!is.null(repos)) + if (!is.null(repos)) { return(repos) + } } - + # retrieve current repos repos <- getOption("repos") - + # ensure @CRAN@ entries are resolved repos[repos == "@CRAN@"] <- cran - + # add in renv.bootstrap.repos if set default <- c(FALLBACK = "https://cloud.r-project.org") extra <- getOption("renv.bootstrap.repos", default = default) repos <- c(repos, extra) - + # remove duplicates that might've snuck in dupes <- duplicated(repos) | duplicated(names(repos)) repos[!dupes] - } - + renv_bootstrap_repos_lockfile <- function() { - lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") - if (!file.exists(lockpath)) + if (!file.exists(lockpath)) { return(NULL) - + } + lockfile <- tryCatch(renv_json_read(lockpath), error = identity) if (inherits(lockfile, "error")) { warning(lockfile) return(NULL) } - + repos <- lockfile$R$Repositories - if (length(repos) == 0) + if (length(repos) == 0) { return(NULL) - + } + keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) names(vals) <- keys - + return(vals) - } - + renv_bootstrap_download <- function(version) { - # if the renv version number has 4 components, assume it must # be retrieved via github nv <- numeric_version(version) components <- unclass(nv)[[1]] - + # if this appears to be a development version of 'renv', we'll # try to restore from github dev <- length(components) == 4L - + # begin collecting different methods for finding renv methods <- c( renv_bootstrap_download_tarball, - if (dev) + if (dev) { renv_bootstrap_download_github - else c( - renv_bootstrap_download_cran_latest, - renv_bootstrap_download_cran_archive - ) + } else { + c( + renv_bootstrap_download_cran_latest, + renv_bootstrap_download_cran_archive + ) + } ) - + for (method in methods) { path <- tryCatch(method(version), error = identity) - if (is.character(path) && file.exists(path)) + if (is.character(path) && file.exists(path)) { return(path) + } } - + stop("failed to download renv ", version) - } - + renv_bootstrap_download_impl <- function(url, destfile) { - mode <- "wb" - + # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 fixup <- Sys.info()[["sysname"]] == "Windows" && - substring(url, 1L, 5L) == "file:" - - if (fixup) + substring(url, 1L, 5L) == "file:" + + if (fixup) { mode <- "w+b" - + } + args <- list( url = url, destfile = destfile, mode = mode, quiet = TRUE ) - - if ("headers" %in% names(formals(utils::download.file))) + + if ("headers" %in% names(formals(utils::download.file))) { args$headers <- renv_bootstrap_download_custom_headers(url) - + } + do.call(utils::download.file, args) - } - + renv_bootstrap_download_custom_headers <- function(url) { - headers <- getOption("renv.download.headers") - if (is.null(headers)) + if (is.null(headers)) { return(character()) - - if (!is.function(headers)) + } + + if (!is.function(headers)) { stopf("'renv.download.headers' is not a function") - + } + headers <- headers(url) - if (length(headers) == 0L) + if (length(headers) == 0L) { return(character()) - - if (is.list(headers)) + } + + if (is.list(headers)) { headers <- unlist(headers, recursive = FALSE, use.names = TRUE) - + } + ok <- is.character(headers) && - is.character(names(headers)) && - all(nzchar(names(headers))) - - if (!ok) + is.character(names(headers)) && + all(nzchar(names(headers))) + + if (!ok) { stop("invocation of 'renv.download.headers' did not return a named character vector") - + } + headers - } - + renv_bootstrap_download_cran_latest <- function(version) { - spec <- renv_bootstrap_download_cran_latest_find(version) - type <- spec$type + type <- spec$type repos <- spec$repos - + message("* Downloading renv ", version, " ... ", appendLF = FALSE) - + baseurl <- utils::contrib.url(repos = repos, type = type) - ext <- if (identical(type, "source")) + ext <- if (identical(type, "source")) { ".tar.gz" - else if (Sys.info()[["sysname"]] == "Windows") + } else if (Sys.info()[["sysname"]] == "Windows") { ".zip" - else + } else { ".tgz" + } name <- sprintf("renv_%s%s", version, ext) url <- paste(baseurl, name, sep = "/") - + destfile <- file.path(tempdir(), name) status <- tryCatch( renv_bootstrap_download_impl(url, destfile), condition = identity ) - + if (inherits(status, "condition")) { message("FAILED") return(FALSE) } - + # report success and return message("OK (downloaded ", type, ")") destfile - } - + renv_bootstrap_download_cran_latest_find <- function(version) { - # check whether binaries are supported on this system binary <- getOption("renv.bootstrap.binary", default = TRUE) && - !identical(.Platform$pkgType, "source") && - !identical(getOption("pkgType"), "source") && - Sys.info()[["sysname"]] %in% c("Darwin", "Windows") - + !identical(.Platform$pkgType, "source") && + !identical(getOption("pkgType"), "source") && + Sys.info()[["sysname"]] %in% c("Darwin", "Windows") + types <- c(if (binary) "binary", "source") - + # iterate over types + repositories for (type in types) { for (repos in renv_bootstrap_repos()) { - # retrieve package database db <- tryCatch( as.data.frame( @@ -300,97 +300,90 @@ local({ ), error = identity ) - - if (inherits(db, "error")) + + if (inherits(db, "error")) { next - + } + # check for compatible entry entry <- db[db$Package %in% "renv" & db$Version %in% version, ] - if (nrow(entry) == 0) + if (nrow(entry) == 0) { next - + } + # found it; return spec to caller spec <- list(entry = entry, type = type, repos = repos) return(spec) - } } - + # if we got here, we failed to find renv fmt <- "renv %s is not available from your declared package repositories" stop(sprintf(fmt, version)) - } - + renv_bootstrap_download_cran_archive <- function(version) { - name <- sprintf("renv_%s.tar.gz", version) repos <- renv_bootstrap_repos() urls <- file.path(repos, "src/contrib/Archive/renv", name) destfile <- file.path(tempdir(), name) - + message("* Downloading renv ", version, " ... ", appendLF = FALSE) - + for (url in urls) { - status <- tryCatch( renv_bootstrap_download_impl(url, destfile), condition = identity ) - + if (identical(status, 0L)) { message("OK") return(destfile) } - } - + message("FAILED") return(FALSE) - } - + renv_bootstrap_download_tarball <- function(version) { - # if the user has provided the path to a tarball via # an environment variable, then use it tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) - if (is.na(tarball)) + if (is.na(tarball)) { return() - + } + # allow directories if (dir.exists(tarball)) { name <- sprintf("renv_%s.tar.gz", version) tarball <- file.path(tarball, name) } - + # bail if it doesn't exist if (!file.exists(tarball)) { - # let the user know we weren't able to honour their request fmt <- "* RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." msg <- sprintf(fmt, tarball) warning(msg) - + # bail return() - } - + fmt <- "* Bootstrapping with tarball at path '%s'." msg <- sprintf(fmt, tarball) message(msg) - + tarball - } - + renv_bootstrap_download_github <- function(version) { - enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") - if (!identical(enabled, "TRUE")) + if (!identical(enabled, "TRUE")) { return(FALSE) - + } + # prepare download options pat <- Sys.getenv("GITHUB_PAT") if (nzchar(Sys.which("curl")) && nzchar(pat)) { @@ -406,48 +399,46 @@ local({ options(download.file.method = "wget", download.file.extra = extra) on.exit(do.call(base::options, saved), add = TRUE) } - + message("* Downloading renv ", version, " from GitHub ... ", appendLF = FALSE) - + url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) name <- sprintf("renv_%s.tar.gz", version) destfile <- file.path(tempdir(), name) - + status <- tryCatch( renv_bootstrap_download_impl(url, destfile), condition = identity ) - + if (!identical(status, 0L)) { message("FAILED") return(FALSE) } - + message("OK") return(destfile) - } - + renv_bootstrap_install <- function(version, tarball, library) { - # attempt to install it into project library message("* Installing renv ", version, " ... ", appendLF = FALSE) dir.create(library, showWarnings = FALSE, recursive = TRUE) - + # invoke using system2 so we can capture and report output bin <- R.home("bin") exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" r <- file.path(bin, exe) - + args <- c( "--vanilla", "CMD", "INSTALL", "--no-multiarch", "-l", shQuote(path.expand(library)), shQuote(path.expand(tarball)) ) - + output <- system2(r, args, stdout = TRUE, stderr = TRUE) message("Done!") - + # check for successful install status <- attr(output, "status") if (is.numeric(status) && !identical(status, 0L)) { @@ -456,101 +447,97 @@ local({ text <- c(header, lines, output) writeLines(text, con = stderr()) } - + status - } - + renv_bootstrap_platform_prefix <- function() { - # construct version prefix version <- paste(R.version$major, R.version$minor, sep = ".") prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") - + # include SVN revision for development versions of R # (to avoid sharing platform-specific artefacts with released versions of R) devel <- - identical(R.version[["status"]], "Under development (unstable)") || - identical(R.version[["nickname"]], "Unsuffered Consequences") - - if (devel) + identical(R.version[["status"]], "Under development (unstable)") || + identical(R.version[["nickname"]], "Unsuffered Consequences") + + if (devel) { prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") - + } + # build list of path components components <- c(prefix, R.version$platform) - + # include prefix if provided by user prefix <- renv_bootstrap_platform_prefix_impl() - if (!is.na(prefix) && nzchar(prefix)) + if (!is.na(prefix) && nzchar(prefix)) { components <- c(prefix, components) - + } + # build prefix paste(components, collapse = "/") - } - + renv_bootstrap_platform_prefix_impl <- function() { - # if an explicit prefix has been supplied, use it prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) - if (!is.na(prefix)) + if (!is.na(prefix)) { return(prefix) - + } + # if the user has requested an automatic prefix, generate it auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) - if (auto %in% c("TRUE", "True", "true", "1")) + if (auto %in% c("TRUE", "True", "true", "1")) { return(renv_bootstrap_platform_prefix_auto()) - + } + # empty string on failure "" - } - + renv_bootstrap_platform_prefix_auto <- function() { - prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) if (inherits(prefix, "error") || prefix %in% "unknown") { - msg <- paste( "failed to infer current operating system", "please file a bug report at https://github.com/rstudio/renv/issues", sep = "; " ) - + warning(msg) - } - + prefix - } - + renv_bootstrap_platform_os <- function() { - sysinfo <- Sys.info() sysname <- sysinfo[["sysname"]] - + # handle Windows + macOS up front - if (sysname == "Windows") + if (sysname == "Windows") { return("windows") - else if (sysname == "Darwin") + } else if (sysname == "Darwin") { return("macos") - + } + # check for os-release files - for (file in c("/etc/os-release", "/usr/lib/os-release")) - if (file.exists(file)) + for (file in c("/etc/os-release", "/usr/lib/os-release")) { + if (file.exists(file)) { return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) - + } + } + # check for redhat-release files - if (file.exists("/etc/redhat-release")) + if (file.exists("/etc/redhat-release")) { return(renv_bootstrap_platform_os_via_redhat_release()) - + } + "unknown" - } - + renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { - # read /etc/os-release release <- utils::read.table( file = file, @@ -560,13 +547,13 @@ local({ comment.char = "#", stringsAsFactors = FALSE ) - + vars <- as.list(release$Value) names(vars) <- release$Key - + # get os name os <- tolower(sysinfo[["sysname"]]) - + # read id id <- "unknown" for (field in c("ID", "ID_LIKE")) { @@ -575,7 +562,7 @@ local({ break } } - + # read version version <- "unknown" for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { @@ -584,212 +571,206 @@ local({ break } } - + # join together paste(c(os, id, version), collapse = "-") - } - + renv_bootstrap_platform_os_via_redhat_release <- function() { - # read /etc/redhat-release contents <- readLines("/etc/redhat-release", warn = FALSE) - + # infer id - id <- if (grepl("centos", contents, ignore.case = TRUE)) + id <- if (grepl("centos", contents, ignore.case = TRUE)) { "centos" - else if (grepl("redhat", contents, ignore.case = TRUE)) + } else if (grepl("redhat", contents, ignore.case = TRUE)) { "redhat" - else + } else { "unknown" - + } + # try to find a version component (very hacky) version <- "unknown" - + parts <- strsplit(contents, "[[:space:]]")[[1L]] for (part in parts) { - nv <- tryCatch(numeric_version(part), error = identity) - if (inherits(nv, "error")) + if (inherits(nv, "error")) { next - + } + version <- nv[1, 1] break - } - + paste(c("linux", id, version), collapse = "-") - } - + renv_bootstrap_library_root_name <- function(project) { - # use project name as-is if requested asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") - if (asis) + if (asis) { return(basename(project)) - + } + # otherwise, disambiguate based on project's path id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) paste(basename(project), id, sep = "-") - } - + renv_bootstrap_library_root <- function(project) { - prefix <- renv_bootstrap_profile_prefix() - + path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) - if (!is.na(path)) + if (!is.na(path)) { return(paste(c(path, prefix), collapse = "/")) - + } + path <- renv_bootstrap_library_root_impl(project) if (!is.null(path)) { name <- renv_bootstrap_library_root_name(project) return(paste(c(path, prefix, name), collapse = "/")) } - + renv_bootstrap_paths_renv("library", project = project) - } - + renv_bootstrap_library_root_impl <- function(project) { - root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) - if (!is.na(root)) + if (!is.na(root)) { return(root) - + } + type <- renv_bootstrap_project_type(project) if (identical(type, "package")) { userdir <- renv_bootstrap_user_dir() return(file.path(userdir, "library")) } - } - + renv_bootstrap_validate_version <- function(version) { - loadedversion <- utils::packageDescription("renv", fields = "Version") - if (version == loadedversion) + if (version == loadedversion) { return(TRUE) - + } + # assume four-component versions are from GitHub; # three-component versions are from CRAN components <- strsplit(loadedversion, "[.-]")[[1]] - remote <- if (length(components) == 4L) + remote <- if (length(components) == 4L) { paste("rstudio/renv", loadedversion, sep = "@") - else + } else { paste("renv", loadedversion, sep = "@") - + } + fmt <- paste( "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", "Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", sep = "\n" ) - + msg <- sprintf(fmt, loadedversion, version, remote) warning(msg, call. = FALSE) - + FALSE - } - + renv_bootstrap_hash_text <- function(text) { - hashfile <- tempfile("renv-hash-") on.exit(unlink(hashfile), add = TRUE) - + writeLines(text, con = hashfile) tools::md5sum(hashfile) - } - + renv_bootstrap_load <- function(project, libpath, version) { - # try to load renv from the project library - if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) + if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { return(FALSE) - + } + # warn if the version of renv loaded does not match renv_bootstrap_validate_version(version) - + # execute renv load hooks, if any hooks <- getHook("renv::autoload") - for (hook in hooks) - if (is.function(hook)) + for (hook in hooks) { + if (is.function(hook)) { tryCatch(hook(), error = warning) - + } + } + # load the project renv::load(project) - + TRUE - } - + renv_bootstrap_profile_load <- function(project) { - # if RENV_PROFILE is already set, just use that profile <- Sys.getenv("RENV_PROFILE", unset = NA) - if (!is.na(profile) && nzchar(profile)) + if (!is.na(profile) && nzchar(profile)) { return(profile) - + } + # check for a profile file (nothing to do if it doesn't exist) path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) - if (!file.exists(path)) + if (!file.exists(path)) { return(NULL) - + } + # read the profile, and set it if it exists contents <- readLines(path, warn = FALSE) - if (length(contents) == 0L) + if (length(contents) == 0L) { return(NULL) - + } + # set RENV_PROFILE profile <- contents[[1L]] - if (!profile %in% c("", "default")) + if (!profile %in% c("", "default")) { Sys.setenv(RENV_PROFILE = profile) - + } + profile - } - + renv_bootstrap_profile_prefix <- function() { profile <- renv_bootstrap_profile_get() - if (!is.null(profile)) + if (!is.null(profile)) { return(file.path("profiles", profile, "renv")) + } } - + renv_bootstrap_profile_get <- function() { profile <- Sys.getenv("RENV_PROFILE", unset = "") renv_bootstrap_profile_normalize(profile) } - + renv_bootstrap_profile_set <- function(profile) { profile <- renv_bootstrap_profile_normalize(profile) - if (is.null(profile)) + if (is.null(profile)) { Sys.unsetenv("RENV_PROFILE") - else + } else { Sys.setenv(RENV_PROFILE = profile) + } } - + renv_bootstrap_profile_normalize <- function(profile) { - - if (is.null(profile) || profile %in% c("", "default")) + if (is.null(profile) || profile %in% c("", "default")) { return(NULL) - + } + profile - } - + renv_bootstrap_path_absolute <- function(path) { - substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( substr(path, 1L, 1L) %in% c(letters, LETTERS) && - substr(path, 2L, 3L) %in% c(":/", ":\\") + substr(path, 2L, 3L) %in% c(":/", ":\\") ) - } - + renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") root <- if (renv_bootstrap_path_absolute(renv)) NULL else project @@ -797,134 +778,134 @@ local({ components <- c(root, renv, prefix, ...) paste(components, collapse = "/") } - + renv_bootstrap_project_type <- function(path) { - descpath <- file.path(path, "DESCRIPTION") - if (!file.exists(descpath)) + if (!file.exists(descpath)) { return("unknown") - + } + desc <- tryCatch( read.dcf(descpath, all = TRUE), error = identity ) - - if (inherits(desc, "error")) + + if (inherits(desc, "error")) { return("unknown") - + } + type <- desc$Type - if (!is.null(type)) + if (!is.null(type)) { return(tolower(type)) - + } + package <- desc$Package - if (!is.null(package)) + if (!is.null(package)) { return("package") - + } + "unknown" - } - + renv_bootstrap_user_dir <- function() { dir <- renv_bootstrap_user_dir_impl() path.expand(chartr("\\", "/", dir)) } - + renv_bootstrap_user_dir_impl <- function() { - # use local override if set override <- getOption("renv.userdir.override") - if (!is.null(override)) + if (!is.null(override)) { return(override) - + } + # use R_user_dir if available tools <- asNamespace("tools") - if (is.function(tools$R_user_dir)) + if (is.function(tools$R_user_dir)) { return(tools$R_user_dir("renv", "cache")) - + } + # try using our own backfill for older versions of R envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") for (envvar in envvars) { root <- Sys.getenv(envvar, unset = NA) - if (!is.na(root)) + if (!is.na(root)) { return(file.path(root, "R/renv")) + } } - + # use platform-specific default fallbacks - if (Sys.info()[["sysname"]] == "Windows") + if (Sys.info()[["sysname"]] == "Windows") { file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") - else if (Sys.info()[["sysname"]] == "Darwin") + } else if (Sys.info()[["sysname"]] == "Darwin") { "~/Library/Caches/org.R-project.R/R/renv" - else + } else { "~/.cache/R/renv" - + } } - - + + renv_json_read <- function(file = NULL, text = NULL) { - jlerr <- NULL - + # if jsonlite is loaded, use that instead if ("jsonlite" %in% loadedNamespaces()) { - json <- catch(renv_json_read_jsonlite(file, text)) - if (!inherits(json, "error")) + if (!inherits(json, "error")) { return(json) - + } + jlerr <- json - } - + # otherwise, fall back to the default JSON reader json <- catch(renv_json_read_default(file, text)) - if (!inherits(json, "error")) + if (!inherits(json, "error")) { return(json) - + } + # report an error - if (!is.null(jlerr)) + if (!is.null(jlerr)) { stop(jlerr) - else + } else { stop(json) - + } } - + renv_json_read_jsonlite <- function(file = NULL, text = NULL) { text <- paste(text %||% read(file), collapse = "\n") jsonlite::fromJSON(txt = text, simplifyVector = FALSE) } - + renv_json_read_default <- function(file = NULL, text = NULL) { - # find strings in the JSON text <- paste(text %||% read(file), collapse = "\n") pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' locs <- gregexpr(pattern, text, perl = TRUE)[[1]] - + # if any are found, replace them with placeholders replaced <- text strings <- character() replacements <- character() - + if (!identical(c(locs), -1L)) { - # get the string values starts <- locs ends <- locs + attr(locs, "match.length") - 1L strings <- substring(text, starts, ends) - + # only keep those requiring escaping strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) - + # compute replacements replacements <- sprintf('"\032%i\032"', seq_along(strings)) - + # replace the strings mapply(function(string, replacement) { replaced <<- sub(string, replacement, replaced, fixed = TRUE) }, strings, replacements) - } - + # transform the JSON into something the R parser understands transformed <- replaced transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE) @@ -932,58 +913,57 @@ local({ transformed <- gsub("[]}]", ")", transformed, perl = TRUE) transformed <- gsub(":", "=", transformed, fixed = TRUE) text <- paste(transformed, collapse = "\n") - + # parse it json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] - + # construct map between source strings, replaced strings map <- as.character(parse(text = strings)) names(map) <- as.character(parse(text = replacements)) - + # convert to list map <- as.list(map) - + # remap strings in object remapped <- renv_json_remap(json, map) - + # evaluate eval(remapped, envir = baseenv()) - } - + renv_json_remap <- function(json, map) { - # fix names if (!is.null(names(json))) { lhs <- match(names(json), names(map), nomatch = 0L) rhs <- match(names(map), names(json), nomatch = 0L) names(json)[rhs] <- map[lhs] } - + # fix values - if (is.character(json)) + if (is.character(json)) { return(map[[json]] %||% json) - + } + # handle true, false, null if (is.name(json)) { text <- as.character(json) - if (text == "true") + if (text == "true") { return(TRUE) - else if (text == "false") + } else if (text == "false") { return(FALSE) - else if (text == "null") + } else if (text == "null") { return(NULL) + } } - + # recurse if (is.recursive(json)) { for (i in seq_along(json)) { json[i] <- list(renv_json_remap(json[[i]], map)) } } - + json - } # load the renv profile, if any @@ -999,8 +979,9 @@ local({ libpath <- file.path(root, prefix) # attempt to load - if (renv_bootstrap_load(project, libpath, version)) + if (renv_bootstrap_load(project, libpath, version)) { return(TRUE) + } # load failed; inform user we're about to bootstrap prefix <- paste("# Bootstrapping renv", version) @@ -1012,8 +993,9 @@ local({ bootstrap(version, libpath) # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) { return(TRUE) + } # try again to load if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { @@ -1028,5 +1010,4 @@ local({ ) warning(paste(msg, collapse = "\n"), call. = FALSE) - }) diff --git a/scripts/trisk_k8s_api/trisk_compute.R b/scripts/trisk_k8s_api/trisk_compute.R index b7601d3..d10d11b 100644 --- a/scripts/trisk_k8s_api/trisk_compute.R +++ b/scripts/trisk_k8s_api/trisk_compute.R @@ -1,7 +1,6 @@ run_trisk_and_upload_results <- function( trisk_run_params, trisk_input_path) { - dbname <- Sys.getenv("ST_POSTGRES_DB") host_db <- Sys.getenv("ST_POSTGRES_HOST") db_port <- Sys.getenv("ST_POSTGRES_PORT") @@ -98,4 +97,3 @@ upload_to_postgres <- function(st_results_wrangled_and_checked, dbname, host_db, } DBI::dbDisconnect(conn) } - diff --git a/tests/testthat/test-main.R b/tests/testthat/test-main.R index d97c996..6e70993 100644 --- a/tests/testthat/test-main.R +++ b/tests/testthat/test-main.R @@ -11,7 +11,8 @@ box::use( test_that("main server works without error", { Sys.setenv(TRISK_INPUT_PATH = file.path("ST_INPUTS_DEV")) - Sys.setenv(BACKEND_TRISK_RUN_FOLDER = tempdir()) + Sys.setenv(TRISK_OUTPUT_PATH = tempdir()) + Sys.setenv(CRISPY_APP_ENV = "dev") expect_error(testServer(server, { diff --git a/tests/testthat/test-trisk_mgmt.R b/tests/testthat/test-trisk_mgmt.R index 7503079..da37835 100644 --- a/tests/testthat/test-trisk_mgmt.R +++ b/tests/testthat/test-trisk_mgmt.R @@ -1,167 +1,169 @@ -box::use( - app / logic / trisk_mgmt[run_trisk_with_params, append_st_results_to_backend_data, check_if_run_exists, get_run_data_from_run_id], - app / logic / constant[max_trisk_granularity] -) - - - -withr::local_envvar(new = c("TRISK_INPUT_PATH" = file.path("ST_INPUTS_DEV"))) -withr::local_envvar(new = c("BACKEND_TRISK_RUN_FOLDER" = tempdir())) - -TEST_TRISK_PARAMS <- list( - baseline_scenario = "Oxford2021_base", - shock_scenario = "Oxford2021_fast", - discount_rate = 0.1, - risk_free_rate = 0.0, - growth_rate = 0.01, - shock_year = 2025, - scenario_geography = "Global", - carbon_price_model = "no_carbon_tax", - market_passthrough = 0.0, - lgd = 0.45, - div_netprofit_prop_coef = 1.0, - start_year = 2022, - financial_stimulus = 1.0 -) - - -test_that("run_trisk_with_params returns company_trajectories, crispy_output, and run_metadata", { - st_results_wrangled_and_checked <- run_trisk_with_params( - trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), - trisk_run_params = TEST_TRISK_PARAMS - ) - expect_equal(names(st_results_wrangled_and_checked), c("company_trajectories", "crispy_output", "run_metadata")) -}) - - -test_that("append_st_results_to_backend_data creates and increments the backend datasets properly", { - TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) - dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) - - expect_true(length(list.files(TEST_BACKEND_TRISK_RUN_FOLDER)) == 0) - - st_results_wrangled_and_checked_1 <- run_trisk_with_params( - trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), - trisk_run_params = TEST_TRISK_PARAMS - ) - - append_st_results_to_backend_data( - st_results_wrangled_and_checked_1, - backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, - max_trisk_granularity = max_trisk_granularity - ) - - expect_equal( - list.files(TEST_BACKEND_TRISK_RUN_FOLDER), - c("company_trajectories.parquet", "crispy_output.parquet", "run_metadata.parquet") - ) - - - st_results_wrangled_and_checked_2 <- run_trisk_with_params( - trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), - trisk_run_params = TEST_TRISK_PARAMS - ) - - append_st_results_to_backend_data( - st_results_wrangled_and_checked_2, - backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, - max_trisk_granularity = max_trisk_granularity - ) - - run_ids <- c( - st_results_wrangled_and_checked_1$run_metadata |> dplyr::pull(run_id), - st_results_wrangled_and_checked_2$run_metadata |> dplyr::pull(run_id) - ) - - run_metadata <- arrow::read_parquet(file.path(TEST_BACKEND_TRISK_RUN_FOLDER, "run_metadata.parquet")) - expect_true(all(run_ids %in% (run_metadata |> dplyr::pull(run_id)))) -}) - - -test_that("check_if_run_exists finds expected run", { - TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) - dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) - - st_results_wrangled_and_checked <- run_trisk_with_params( - trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), - trisk_run_params = TEST_TRISK_PARAMS - ) - append_st_results_to_backend_data( - st_results_wrangled_and_checked, - TEST_BACKEND_TRISK_RUN_FOLDER, - max_trisk_granularity - ) - run_id <- check_if_run_exists( - trisk_run_params = TEST_TRISK_PARAMS, - backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER - ) - - expected_run_id <- st_results_wrangled_and_checked$run_metadata |> dplyr::pull(run_id) - - expect_equal(run_id, expected_run_id) -}) - - -test_that("check_if_run_exists returns NULL if run does not exist", { - TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) - dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) - - st_results_wrangled_and_checked <- run_trisk_with_params( - trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), - trisk_run_params = TEST_TRISK_PARAMS - ) - append_st_results_to_backend_data( - st_results_wrangled_and_checked, - backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, - max_trisk_granularity = max_trisk_granularity - ) - - - wrong_test_params <- TEST_TRISK_PARAMS - wrong_test_params[["shock_year"]] <- 2030 - - run_id <- check_if_run_exists( - trisk_run_params = wrong_test_params, - backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER - ) - - expect_equal(run_id, NULL) -}) - - - - -test_that("get_run_data_from_run_id returns the data associated to the run_id", { - TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) - if (dir.exists(TEST_BACKEND_TRISK_RUN_FOLDER)) { - unlink(TEST_BACKEND_TRISK_RUN_FOLDER, recursive = TRUE) - } - dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) - - st_results_wrangled_and_checked <- run_trisk_with_params( - trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), - trisk_run_params = TEST_TRISK_PARAMS - ) - append_st_results_to_backend_data( - st_results_wrangled_and_checked, - backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, - max_trisk_granularity = max_trisk_granularity - ) - run_id <- check_if_run_exists( - trisk_run_params = TEST_TRISK_PARAMS, - backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER - ) - - run_data <- get_run_data_from_run_id(run_id, TEST_BACKEND_TRISK_RUN_FOLDER) - - crispy_output_run_id <- run_data$crispy_output |> - dplyr::distinct(run_id) |> - dplyr::pull() - expect_equal(crispy_output_run_id, run_id) - - company_trajectories_run_id <- run_data$company_trajectories |> - dplyr::distinct(run_id) |> - dplyr::pull() - - expect_equal(company_trajectories_run_id, run_id) -}) +# box::use( +# app / logic / trisk_mgmt[run_trisk_with_params], +# app/logic/data_write[append_st_results_to_backend_data], +# app/logic/trisk_button_logic[get_run_data_from_run_id], +# app / logic / constant[max_trisk_granularity] +# ) + + + +# withr::local_envvar(new = c("TRISK_INPUT_PATH" = file.path("ST_INPUTS_DEV"))) +# withr::local_envvar(new = c("BACKEND_TRISK_RUN_FOLDER" = tempdir())) + +# TEST_TRISK_PARAMS <- list( +# baseline_scenario = "Oxford2021_base", +# shock_scenario = "Oxford2021_fast", +# discount_rate = 0.1, +# risk_free_rate = 0.0, +# growth_rate = 0.01, +# shock_year = 2025, +# scenario_geography = "Global", +# carbon_price_model = "no_carbon_tax", +# market_passthrough = 0.0, +# lgd = 0.45, +# div_netprofit_prop_coef = 1.0, +# start_year = 2022, +# financial_stimulus = 1.0 +# ) + + +# test_that("run_trisk_with_params returns company_trajectories, crispy_output, and run_metadata", { +# st_results_wrangled_and_checked <- run_trisk_with_params( +# trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), +# trisk_run_params = TEST_TRISK_PARAMS +# ) +# expect_equal(names(st_results_wrangled_and_checked), c("company_trajectories", "crispy_output", "run_metadata")) +# }) + + +# test_that("append_st_results_to_backend_data creates and increments the backend datasets properly", { +# TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) +# dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) + +# expect_true(length(list.files(TEST_BACKEND_TRISK_RUN_FOLDER)) == 0) + +# st_results_wrangled_and_checked_1 <- run_trisk_with_params( +# trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), +# trisk_run_params = TEST_TRISK_PARAMS +# ) + +# append_st_results_to_backend_data( +# st_results_wrangled_and_checked_1, +# backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, +# max_trisk_granularity = max_trisk_granularity +# ) + +# expect_equal( +# list.files(TEST_BACKEND_TRISK_RUN_FOLDER), +# c("company_trajectories.parquet", "crispy_output.parquet", "run_metadata.parquet") +# ) + + +# st_results_wrangled_and_checked_2 <- run_trisk_with_params( +# trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), +# trisk_run_params = TEST_TRISK_PARAMS +# ) + +# append_st_results_to_backend_data( +# st_results_wrangled_and_checked_2, +# backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, +# max_trisk_granularity = max_trisk_granularity +# ) + +# run_ids <- c( +# st_results_wrangled_and_checked_1$run_metadata |> dplyr::pull(run_id), +# st_results_wrangled_and_checked_2$run_metadata |> dplyr::pull(run_id) +# ) + +# run_metadata <- arrow::read_parquet(file.path(TEST_BACKEND_TRISK_RUN_FOLDER, "run_metadata.parquet")) +# expect_true(all(run_ids %in% (run_metadata |> dplyr::pull(run_id)))) +# }) + + +# test_that("check_if_run_exists finds expected run", { +# TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) +# dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) + +# st_results_wrangled_and_checked <- run_trisk_with_params( +# trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), +# trisk_run_params = TEST_TRISK_PARAMS +# ) +# append_st_results_to_backend_data( +# st_results_wrangled_and_checked, +# TEST_BACKEND_TRISK_RUN_FOLDER, +# max_trisk_granularity +# ) +# run_id <- check_if_run_exists( +# trisk_run_params = TEST_TRISK_PARAMS, +# backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER +# ) + +# expected_run_id <- st_results_wrangled_and_checked$run_metadata |> dplyr::pull(run_id) + +# expect_equal(run_id, expected_run_id) +# }) + + +# test_that("check_if_run_exists returns NULL if run does not exist", { +# TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) +# dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) + +# st_results_wrangled_and_checked <- run_trisk_with_params( +# trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), +# trisk_run_params = TEST_TRISK_PARAMS +# ) +# append_st_results_to_backend_data( +# st_results_wrangled_and_checked, +# backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, +# max_trisk_granularity = max_trisk_granularity +# ) + + +# wrong_test_params <- TEST_TRISK_PARAMS +# wrong_test_params[["shock_year"]] <- 2030 + +# run_id <- check_if_run_exists( +# trisk_run_params = wrong_test_params, +# backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER +# ) + +# expect_equal(run_id, NULL) +# }) + + + + +# test_that("get_run_data_from_run_id returns the data associated to the run_id", { +# TEST_BACKEND_TRISK_RUN_FOLDER <- file.path(Sys.getenv("BACKEND_TRISK_RUN_FOLDER"), uuid::UUIDgenerate()) +# if (dir.exists(TEST_BACKEND_TRISK_RUN_FOLDER)) { +# unlink(TEST_BACKEND_TRISK_RUN_FOLDER, recursive = TRUE) +# } +# dir.create(TEST_BACKEND_TRISK_RUN_FOLDER) + +# st_results_wrangled_and_checked <- run_trisk_with_params( +# trisk_input_path = Sys.getenv("TRISK_INPUT_PATH"), +# trisk_run_params = TEST_TRISK_PARAMS +# ) +# append_st_results_to_backend_data( +# st_results_wrangled_and_checked, +# backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER, +# max_trisk_granularity = max_trisk_granularity +# ) +# run_id <- check_if_run_exists( +# trisk_run_params = TEST_TRISK_PARAMS, +# backend_trisk_run_folder = TEST_BACKEND_TRISK_RUN_FOLDER +# ) + +# run_data <- get_run_data_from_run_id(run_id, TEST_BACKEND_TRISK_RUN_FOLDER) + +# crispy_output_run_id <- run_data$crispy_output |> +# dplyr::distinct(run_id) |> +# dplyr::pull() +# expect_equal(crispy_output_run_id, run_id) + +# company_trajectories_run_id <- run_data$company_trajectories |> +# dplyr::distinct(run_id) |> +# dplyr::pull() + +# expect_equal(company_trajectories_run_id, run_id) +# }) From 967219b21245bb634179d694154e670f35951e5a Mon Sep 17 00:00:00 2001 From: bertrand Date: Tue, 20 Feb 2024 15:49:39 +0100 Subject: [PATCH 15/15] remove data --- .gitignore | 1 + scripts/creds.R | 0 scripts/trisk_k8s_api/renv/activate.R | 1013 +++++++++++++++++++++++++ 3 files changed, 1014 insertions(+) delete mode 100644 scripts/creds.R diff --git a/.gitignore b/.gitignore index 568c3a5..4350c1b 100644 --- a/.gitignore +++ b/.gitignore @@ -2685,3 +2685,4 @@ scripts/trisk_knative/st_inputs/prewrangled_capacity_factors.csv scripts/trisk_knative/st_inputs/prewrangled_financial_data_stress_test.csv scripts/trisk_knative/st_inputs/price_data_long.csv scripts/trisk_knative/st_inputs/Scenarios_AnalysisInput.csv +scripts/creds.R diff --git a/scripts/creds.R b/scripts/creds.R deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/trisk_k8s_api/renv/activate.R b/scripts/trisk_k8s_api/renv/activate.R index e69de29..8744041 100644 --- a/scripts/trisk_k8s_api/renv/activate.R +++ b/scripts/trisk_k8s_api/renv/activate.R @@ -0,0 +1,1013 @@ +local({ + # the requested version of renv + version <- "0.17.3" + + # the project directory + project <- getwd() + + # figure out whether the autoloader is enabled + enabled <- local({ + # first, check config option + override <- getOption("renv.config.autoloader.enabled") + if (!is.null(override)) { + return(override) + } + + # next, check environment variables + # TODO: prefer using the configuration one in the future + envvars <- c( + "RENV_CONFIG_AUTOLOADER_ENABLED", + "RENV_AUTOLOADER_ENABLED", + "RENV_ACTIVATE_PROJECT" + ) + + for (envvar in envvars) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) { + return(tolower(envval) %in% c("true", "t", "1")) + } + } + + # enable by default + TRUE + }) + + if (!enabled) { + return(FALSE) + } + + # avoid recursion + if (identical(getOption("renv.autoloader.running"), TRUE)) { + warning("ignoring recursive attempt to run renv autoloader") + return(invisible(TRUE)) + } + + # signal that we're loading renv during R startup + options(renv.autoloader.running = TRUE) + on.exit(options(renv.autoloader.running = NULL), add = TRUE) + + # signal that we've consented to use renv + options(renv.consent = TRUE) + + # load the 'utils' package eagerly -- this ensures that renv shims, which + # mask 'utils' packages, will come first on the search path + library(utils, lib.loc = .Library) + + # unload renv if it's already been loaded + if ("renv" %in% loadedNamespaces()) { + unloadNamespace("renv") + } + + # load bootstrap tools + `%||%` <- function(x, y) { + if (is.environment(x) || length(x)) x else y + } + + `%??%` <- function(x, y) { + if (is.null(x)) y else x + } + + bootstrap <- function(version, library) { + # attempt to download renv + tarball <- tryCatch(renv_bootstrap_download(version), error = identity) + if (inherits(tarball, "error")) { + stop("failed to download renv ", version) + } + + # now attempt to install + status <- tryCatch(renv_bootstrap_install(version, tarball, library), error = identity) + if (inherits(status, "error")) { + stop("failed to install renv ", version) + } + } + + renv_bootstrap_tests_running <- function() { + getOption("renv.tests.running", default = FALSE) + } + + renv_bootstrap_repos <- function() { + # get CRAN repository + cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") + + # check for repos override + repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) + if (!is.na(repos)) { + # check for RSPM; if set, use a fallback repository for renv + rspm <- Sys.getenv("RSPM", unset = NA) + if (identical(rspm, repos)) { + repos <- c(RSPM = rspm, CRAN = cran) + } + + return(repos) + } + + # check for lockfile repositories + repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) + if (!inherits(repos, "error") && length(repos)) { + return(repos) + } + + # if we're testing, re-use the test repositories + if (renv_bootstrap_tests_running()) { + repos <- getOption("renv.tests.repos") + if (!is.null(repos)) { + return(repos) + } + } + + # retrieve current repos + repos <- getOption("repos") + + # ensure @CRAN@ entries are resolved + repos[repos == "@CRAN@"] <- cran + + # add in renv.bootstrap.repos if set + default <- c(FALLBACK = "https://cloud.r-project.org") + extra <- getOption("renv.bootstrap.repos", default = default) + repos <- c(repos, extra) + + # remove duplicates that might've snuck in + dupes <- duplicated(repos) | duplicated(names(repos)) + repos[!dupes] + } + + renv_bootstrap_repos_lockfile <- function() { + lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") + if (!file.exists(lockpath)) { + return(NULL) + } + + lockfile <- tryCatch(renv_json_read(lockpath), error = identity) + if (inherits(lockfile, "error")) { + warning(lockfile) + return(NULL) + } + + repos <- lockfile$R$Repositories + if (length(repos) == 0) { + return(NULL) + } + + keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) + vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) + names(vals) <- keys + + return(vals) + } + + renv_bootstrap_download <- function(version) { + # if the renv version number has 4 components, assume it must + # be retrieved via github + nv <- numeric_version(version) + components <- unclass(nv)[[1]] + + # if this appears to be a development version of 'renv', we'll + # try to restore from github + dev <- length(components) == 4L + + # begin collecting different methods for finding renv + methods <- c( + renv_bootstrap_download_tarball, + if (dev) { + renv_bootstrap_download_github + } else { + c( + renv_bootstrap_download_cran_latest, + renv_bootstrap_download_cran_archive + ) + } + ) + + for (method in methods) { + path <- tryCatch(method(version), error = identity) + if (is.character(path) && file.exists(path)) { + return(path) + } + } + + stop("failed to download renv ", version) + } + + renv_bootstrap_download_impl <- function(url, destfile) { + mode <- "wb" + + # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 + fixup <- + Sys.info()[["sysname"]] == "Windows" && + substring(url, 1L, 5L) == "file:" + + if (fixup) { + mode <- "w+b" + } + + args <- list( + url = url, + destfile = destfile, + mode = mode, + quiet = TRUE + ) + + if ("headers" %in% names(formals(utils::download.file))) { + args$headers <- renv_bootstrap_download_custom_headers(url) + } + + do.call(utils::download.file, args) + } + + renv_bootstrap_download_custom_headers <- function(url) { + headers <- getOption("renv.download.headers") + if (is.null(headers)) { + return(character()) + } + + if (!is.function(headers)) { + stopf("'renv.download.headers' is not a function") + } + + headers <- headers(url) + if (length(headers) == 0L) { + return(character()) + } + + if (is.list(headers)) { + headers <- unlist(headers, recursive = FALSE, use.names = TRUE) + } + + ok <- + is.character(headers) && + is.character(names(headers)) && + all(nzchar(names(headers))) + + if (!ok) { + stop("invocation of 'renv.download.headers' did not return a named character vector") + } + + headers + } + + renv_bootstrap_download_cran_latest <- function(version) { + spec <- renv_bootstrap_download_cran_latest_find(version) + type <- spec$type + repos <- spec$repos + + message("* Downloading renv ", version, " ... ", appendLF = FALSE) + + baseurl <- utils::contrib.url(repos = repos, type = type) + ext <- if (identical(type, "source")) { + ".tar.gz" + } else if (Sys.info()[["sysname"]] == "Windows") { + ".zip" + } else { + ".tgz" + } + name <- sprintf("renv_%s%s", version, ext) + url <- paste(baseurl, name, sep = "/") + + destfile <- file.path(tempdir(), name) + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (inherits(status, "condition")) { + message("FAILED") + return(FALSE) + } + + # report success and return + message("OK (downloaded ", type, ")") + destfile + } + + renv_bootstrap_download_cran_latest_find <- function(version) { + # check whether binaries are supported on this system + binary <- + getOption("renv.bootstrap.binary", default = TRUE) && + !identical(.Platform$pkgType, "source") && + !identical(getOption("pkgType"), "source") && + Sys.info()[["sysname"]] %in% c("Darwin", "Windows") + + types <- c(if (binary) "binary", "source") + + # iterate over types + repositories + for (type in types) { + for (repos in renv_bootstrap_repos()) { + # retrieve package database + db <- tryCatch( + as.data.frame( + utils::available.packages(type = type, repos = repos), + stringsAsFactors = FALSE + ), + error = identity + ) + + if (inherits(db, "error")) { + next + } + + # check for compatible entry + entry <- db[db$Package %in% "renv" & db$Version %in% version, ] + if (nrow(entry) == 0) { + next + } + + # found it; return spec to caller + spec <- list(entry = entry, type = type, repos = repos) + return(spec) + } + } + + # if we got here, we failed to find renv + fmt <- "renv %s is not available from your declared package repositories" + stop(sprintf(fmt, version)) + } + + renv_bootstrap_download_cran_archive <- function(version) { + name <- sprintf("renv_%s.tar.gz", version) + repos <- renv_bootstrap_repos() + urls <- file.path(repos, "src/contrib/Archive/renv", name) + destfile <- file.path(tempdir(), name) + + message("* Downloading renv ", version, " ... ", appendLF = FALSE) + + for (url in urls) { + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (identical(status, 0L)) { + message("OK") + return(destfile) + } + } + + message("FAILED") + return(FALSE) + } + + renv_bootstrap_download_tarball <- function(version) { + # if the user has provided the path to a tarball via + # an environment variable, then use it + tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) + if (is.na(tarball)) { + return() + } + + # allow directories + if (dir.exists(tarball)) { + name <- sprintf("renv_%s.tar.gz", version) + tarball <- file.path(tarball, name) + } + + # bail if it doesn't exist + if (!file.exists(tarball)) { + # let the user know we weren't able to honour their request + fmt <- "* RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." + msg <- sprintf(fmt, tarball) + warning(msg) + + # bail + return() + } + + fmt <- "* Bootstrapping with tarball at path '%s'." + msg <- sprintf(fmt, tarball) + message(msg) + + tarball + } + + renv_bootstrap_download_github <- function(version) { + enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") + if (!identical(enabled, "TRUE")) { + return(FALSE) + } + + # prepare download options + pat <- Sys.getenv("GITHUB_PAT") + if (nzchar(Sys.which("curl")) && nzchar(pat)) { + fmt <- "--location --fail --header \"Authorization: token %s\"" + extra <- sprintf(fmt, pat) + saved <- options("download.file.method", "download.file.extra") + options(download.file.method = "curl", download.file.extra = extra) + on.exit(do.call(base::options, saved), add = TRUE) + } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { + fmt <- "--header=\"Authorization: token %s\"" + extra <- sprintf(fmt, pat) + saved <- options("download.file.method", "download.file.extra") + options(download.file.method = "wget", download.file.extra = extra) + on.exit(do.call(base::options, saved), add = TRUE) + } + + message("* Downloading renv ", version, " from GitHub ... ", appendLF = FALSE) + + url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) + name <- sprintf("renv_%s.tar.gz", version) + destfile <- file.path(tempdir(), name) + + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (!identical(status, 0L)) { + message("FAILED") + return(FALSE) + } + + message("OK") + return(destfile) + } + + renv_bootstrap_install <- function(version, tarball, library) { + # attempt to install it into project library + message("* Installing renv ", version, " ... ", appendLF = FALSE) + dir.create(library, showWarnings = FALSE, recursive = TRUE) + + # invoke using system2 so we can capture and report output + bin <- R.home("bin") + exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" + r <- file.path(bin, exe) + + args <- c( + "--vanilla", "CMD", "INSTALL", "--no-multiarch", + "-l", shQuote(path.expand(library)), + shQuote(path.expand(tarball)) + ) + + output <- system2(r, args, stdout = TRUE, stderr = TRUE) + message("Done!") + + # check for successful install + status <- attr(output, "status") + if (is.numeric(status) && !identical(status, 0L)) { + header <- "Error installing renv:" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- c(header, lines, output) + writeLines(text, con = stderr()) + } + + status + } + + renv_bootstrap_platform_prefix <- function() { + # construct version prefix + version <- paste(R.version$major, R.version$minor, sep = ".") + prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") + + # include SVN revision for development versions of R + # (to avoid sharing platform-specific artefacts with released versions of R) + devel <- + identical(R.version[["status"]], "Under development (unstable)") || + identical(R.version[["nickname"]], "Unsuffered Consequences") + + if (devel) { + prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") + } + + # build list of path components + components <- c(prefix, R.version$platform) + + # include prefix if provided by user + prefix <- renv_bootstrap_platform_prefix_impl() + if (!is.na(prefix) && nzchar(prefix)) { + components <- c(prefix, components) + } + + # build prefix + paste(components, collapse = "/") + } + + renv_bootstrap_platform_prefix_impl <- function() { + # if an explicit prefix has been supplied, use it + prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) + if (!is.na(prefix)) { + return(prefix) + } + + # if the user has requested an automatic prefix, generate it + auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) + if (auto %in% c("TRUE", "True", "true", "1")) { + return(renv_bootstrap_platform_prefix_auto()) + } + + # empty string on failure + "" + } + + renv_bootstrap_platform_prefix_auto <- function() { + prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) + if (inherits(prefix, "error") || prefix %in% "unknown") { + msg <- paste( + "failed to infer current operating system", + "please file a bug report at https://github.com/rstudio/renv/issues", + sep = "; " + ) + + warning(msg) + } + + prefix + } + + renv_bootstrap_platform_os <- function() { + sysinfo <- Sys.info() + sysname <- sysinfo[["sysname"]] + + # handle Windows + macOS up front + if (sysname == "Windows") { + return("windows") + } else if (sysname == "Darwin") { + return("macos") + } + + # check for os-release files + for (file in c("/etc/os-release", "/usr/lib/os-release")) { + if (file.exists(file)) { + return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) + } + } + + # check for redhat-release files + if (file.exists("/etc/redhat-release")) { + return(renv_bootstrap_platform_os_via_redhat_release()) + } + + "unknown" + } + + renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { + # read /etc/os-release + release <- utils::read.table( + file = file, + sep = "=", + quote = c("\"", "'"), + col.names = c("Key", "Value"), + comment.char = "#", + stringsAsFactors = FALSE + ) + + vars <- as.list(release$Value) + names(vars) <- release$Key + + # get os name + os <- tolower(sysinfo[["sysname"]]) + + # read id + id <- "unknown" + for (field in c("ID", "ID_LIKE")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + id <- vars[[field]] + break + } + } + + # read version + version <- "unknown" + for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + version <- vars[[field]] + break + } + } + + # join together + paste(c(os, id, version), collapse = "-") + } + + renv_bootstrap_platform_os_via_redhat_release <- function() { + # read /etc/redhat-release + contents <- readLines("/etc/redhat-release", warn = FALSE) + + # infer id + id <- if (grepl("centos", contents, ignore.case = TRUE)) { + "centos" + } else if (grepl("redhat", contents, ignore.case = TRUE)) { + "redhat" + } else { + "unknown" + } + + # try to find a version component (very hacky) + version <- "unknown" + + parts <- strsplit(contents, "[[:space:]]")[[1L]] + for (part in parts) { + nv <- tryCatch(numeric_version(part), error = identity) + if (inherits(nv, "error")) { + next + } + + version <- nv[1, 1] + break + } + + paste(c("linux", id, version), collapse = "-") + } + + renv_bootstrap_library_root_name <- function(project) { + # use project name as-is if requested + asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") + if (asis) { + return(basename(project)) + } + + # otherwise, disambiguate based on project's path + id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) + paste(basename(project), id, sep = "-") + } + + renv_bootstrap_library_root <- function(project) { + prefix <- renv_bootstrap_profile_prefix() + + path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) + if (!is.na(path)) { + return(paste(c(path, prefix), collapse = "/")) + } + + path <- renv_bootstrap_library_root_impl(project) + if (!is.null(path)) { + name <- renv_bootstrap_library_root_name(project) + return(paste(c(path, prefix, name), collapse = "/")) + } + + renv_bootstrap_paths_renv("library", project = project) + } + + renv_bootstrap_library_root_impl <- function(project) { + root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) + if (!is.na(root)) { + return(root) + } + + type <- renv_bootstrap_project_type(project) + if (identical(type, "package")) { + userdir <- renv_bootstrap_user_dir() + return(file.path(userdir, "library")) + } + } + + renv_bootstrap_validate_version <- function(version) { + loadedversion <- utils::packageDescription("renv", fields = "Version") + if (version == loadedversion) { + return(TRUE) + } + + # assume four-component versions are from GitHub; + # three-component versions are from CRAN + components <- strsplit(loadedversion, "[.-]")[[1]] + remote <- if (length(components) == 4L) { + paste("rstudio/renv", loadedversion, sep = "@") + } else { + paste("renv", loadedversion, sep = "@") + } + + fmt <- paste( + "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", + "Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", + "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", + sep = "\n" + ) + + msg <- sprintf(fmt, loadedversion, version, remote) + warning(msg, call. = FALSE) + + FALSE + } + + renv_bootstrap_hash_text <- function(text) { + hashfile <- tempfile("renv-hash-") + on.exit(unlink(hashfile), add = TRUE) + + writeLines(text, con = hashfile) + tools::md5sum(hashfile) + } + + renv_bootstrap_load <- function(project, libpath, version) { + # try to load renv from the project library + if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + return(FALSE) + } + + # warn if the version of renv loaded does not match + renv_bootstrap_validate_version(version) + + # execute renv load hooks, if any + hooks <- getHook("renv::autoload") + for (hook in hooks) { + if (is.function(hook)) { + tryCatch(hook(), error = warning) + } + } + + # load the project + renv::load(project) + + TRUE + } + + renv_bootstrap_profile_load <- function(project) { + # if RENV_PROFILE is already set, just use that + profile <- Sys.getenv("RENV_PROFILE", unset = NA) + if (!is.na(profile) && nzchar(profile)) { + return(profile) + } + + # check for a profile file (nothing to do if it doesn't exist) + path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) + if (!file.exists(path)) { + return(NULL) + } + + # read the profile, and set it if it exists + contents <- readLines(path, warn = FALSE) + if (length(contents) == 0L) { + return(NULL) + } + + # set RENV_PROFILE + profile <- contents[[1L]] + if (!profile %in% c("", "default")) { + Sys.setenv(RENV_PROFILE = profile) + } + + profile + } + + renv_bootstrap_profile_prefix <- function() { + profile <- renv_bootstrap_profile_get() + if (!is.null(profile)) { + return(file.path("profiles", profile, "renv")) + } + } + + renv_bootstrap_profile_get <- function() { + profile <- Sys.getenv("RENV_PROFILE", unset = "") + renv_bootstrap_profile_normalize(profile) + } + + renv_bootstrap_profile_set <- function(profile) { + profile <- renv_bootstrap_profile_normalize(profile) + if (is.null(profile)) { + Sys.unsetenv("RENV_PROFILE") + } else { + Sys.setenv(RENV_PROFILE = profile) + } + } + + renv_bootstrap_profile_normalize <- function(profile) { + if (is.null(profile) || profile %in% c("", "default")) { + return(NULL) + } + + profile + } + + renv_bootstrap_path_absolute <- function(path) { + substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( + substr(path, 1L, 1L) %in% c(letters, LETTERS) && + substr(path, 2L, 3L) %in% c(":/", ":\\") + ) + } + + renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { + renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") + root <- if (renv_bootstrap_path_absolute(renv)) NULL else project + prefix <- if (profile) renv_bootstrap_profile_prefix() + components <- c(root, renv, prefix, ...) + paste(components, collapse = "/") + } + + renv_bootstrap_project_type <- function(path) { + descpath <- file.path(path, "DESCRIPTION") + if (!file.exists(descpath)) { + return("unknown") + } + + desc <- tryCatch( + read.dcf(descpath, all = TRUE), + error = identity + ) + + if (inherits(desc, "error")) { + return("unknown") + } + + type <- desc$Type + if (!is.null(type)) { + return(tolower(type)) + } + + package <- desc$Package + if (!is.null(package)) { + return("package") + } + + "unknown" + } + + renv_bootstrap_user_dir <- function() { + dir <- renv_bootstrap_user_dir_impl() + path.expand(chartr("\\", "/", dir)) + } + + renv_bootstrap_user_dir_impl <- function() { + # use local override if set + override <- getOption("renv.userdir.override") + if (!is.null(override)) { + return(override) + } + + # use R_user_dir if available + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) { + return(tools$R_user_dir("renv", "cache")) + } + + # try using our own backfill for older versions of R + envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") + for (envvar in envvars) { + root <- Sys.getenv(envvar, unset = NA) + if (!is.na(root)) { + return(file.path(root, "R/renv")) + } + } + + # use platform-specific default fallbacks + if (Sys.info()[["sysname"]] == "Windows") { + file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") + } else if (Sys.info()[["sysname"]] == "Darwin") { + "~/Library/Caches/org.R-project.R/R/renv" + } else { + "~/.cache/R/renv" + } + } + + + renv_json_read <- function(file = NULL, text = NULL) { + jlerr <- NULL + + # if jsonlite is loaded, use that instead + if ("jsonlite" %in% loadedNamespaces()) { + json <- catch(renv_json_read_jsonlite(file, text)) + if (!inherits(json, "error")) { + return(json) + } + + jlerr <- json + } + + # otherwise, fall back to the default JSON reader + json <- catch(renv_json_read_default(file, text)) + if (!inherits(json, "error")) { + return(json) + } + + # report an error + if (!is.null(jlerr)) { + stop(jlerr) + } else { + stop(json) + } + } + + renv_json_read_jsonlite <- function(file = NULL, text = NULL) { + text <- paste(text %||% read(file), collapse = "\n") + jsonlite::fromJSON(txt = text, simplifyVector = FALSE) + } + + renv_json_read_default <- function(file = NULL, text = NULL) { + # find strings in the JSON + text <- paste(text %||% read(file), collapse = "\n") + pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + locs <- gregexpr(pattern, text, perl = TRUE)[[1]] + + # if any are found, replace them with placeholders + replaced <- text + strings <- character() + replacements <- character() + + if (!identical(c(locs), -1L)) { + # get the string values + starts <- locs + ends <- locs + attr(locs, "match.length") - 1L + strings <- substring(text, starts, ends) + + # only keep those requiring escaping + strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) + + # compute replacements + replacements <- sprintf('"\032%i\032"', seq_along(strings)) + + # replace the strings + mapply(function(string, replacement) { + replaced <<- sub(string, replacement, replaced, fixed = TRUE) + }, strings, replacements) + } + + # transform the JSON into something the R parser understands + transformed <- replaced + transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE) + transformed <- gsub("[[{]", "list(", transformed, perl = TRUE) + transformed <- gsub("[]}]", ")", transformed, perl = TRUE) + transformed <- gsub(":", "=", transformed, fixed = TRUE) + text <- paste(transformed, collapse = "\n") + + # parse it + json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] + + # construct map between source strings, replaced strings + map <- as.character(parse(text = strings)) + names(map) <- as.character(parse(text = replacements)) + + # convert to list + map <- as.list(map) + + # remap strings in object + remapped <- renv_json_remap(json, map) + + # evaluate + eval(remapped, envir = baseenv()) + } + + renv_json_remap <- function(json, map) { + # fix names + if (!is.null(names(json))) { + lhs <- match(names(json), names(map), nomatch = 0L) + rhs <- match(names(map), names(json), nomatch = 0L) + names(json)[rhs] <- map[lhs] + } + + # fix values + if (is.character(json)) { + return(map[[json]] %||% json) + } + + # handle true, false, null + if (is.name(json)) { + text <- as.character(json) + if (text == "true") { + return(TRUE) + } else if (text == "false") { + return(FALSE) + } else if (text == "null") { + return(NULL) + } + } + + # recurse + if (is.recursive(json)) { + for (i in seq_along(json)) { + json[i] <- list(renv_json_remap(json[[i]], map)) + } + } + + json + } + + # load the renv profile, if any + renv_bootstrap_profile_load(project) + + # construct path to library root + root <- renv_bootstrap_library_root(project) + + # construct library prefix for platform + prefix <- renv_bootstrap_platform_prefix() + + # construct full libpath + libpath <- file.path(root, prefix) + + # attempt to load + if (renv_bootstrap_load(project, libpath, version)) { + return(TRUE) + } + + # load failed; inform user we're about to bootstrap + prefix <- paste("# Bootstrapping renv", version) + postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "") + header <- paste(prefix, postfix) + message(header) + + # perform bootstrap + bootstrap(version, libpath) + + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) { + return(TRUE) + } + + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + message("* Successfully installed and loaded renv ", version, ".") + return(renv::load()) + } + + # failed to download or load renv; warn the user + msg <- c( + "Failed to find an renv installation: the project will not be loaded.", + "Use `renv::activate()` to re-initialize the project." + ) + + warning(paste(msg, collapse = "\n"), call. = FALSE) +})