batch-run-csv-analyser / multiple_env_loader.py
BananaSauce's picture
added auto loader that doesnt work
295a9df
# Use default Streamlit page configuration
import streamlit as st
# Configure the Streamlit app to use a wide layout for maximum content width
st.set_page_config(layout="wide")
def main():
from pathlib import Path
from datetime import datetime, timedelta
from pre import preprocess_uploaded_file
from environment_loader import get_environments_paths
from multiple import perform_analysis
# Sidebar: Environment selection and loading options
st.sidebar.header("Auto Environment Loader")
base_path = st.sidebar.text_input("Base folder path", "Q:/Selenium_Reports")
# Dynamically discover available environment folders
env_root = Path(base_path)
try:
env_codes = [p.name for p in env_root.iterdir() if p.is_dir()]
except Exception:
env_codes = []
st.sidebar.error(f"Could not list environments under {base_path}")
selected_envs = st.sidebar.multiselect("Select environments to load", env_codes)
# For envs ending with 'FIN', let user pick one of the 3 most recent files
version_selection = {}
for env in selected_envs:
# Only FIN environments get manual version selection
if env.upper().endswith('FIN'):
folder = Path(base_path) / env / 'XLSX'
if not folder.exists():
st.sidebar.warning(f"No folder found for environment {env}: {folder}")
continue
# List the 3 most recent files
recent_files = sorted(folder.glob('*.xlsx'), key=lambda f: f.stat().st_mtime, reverse=True)[:3]
if not recent_files:
st.sidebar.warning(f"No .xlsx files found for environment {env}")
continue
labels = [f.name for f in recent_files]
choice = st.sidebar.selectbox(f"Select version for {env}", labels, index=0, key=f"select_{env}")
version_selection[env] = folder / choice
# Initialize session state for incremental loading
if 'loaded_envs' not in st.session_state:
st.session_state.loaded_envs = []
if 'uploaded_env_data' not in st.session_state:
st.session_state.uploaded_env_data = {}
if st.sidebar.button("Load Latest Files", use_container_width=True):
if not selected_envs:
st.sidebar.warning("Please select at least one environment to load.")
else:
# Determine which environments are new
new_envs = [env for env in selected_envs if env not in st.session_state.loaded_envs]
if not new_envs:
st.sidebar.info("βœ… All selected environments are already loaded.")
return
# Build paths: manual picks for FIN envs, auto for others
paths = {}
missing = []
fin_envs = [env for env in new_envs if env.upper().endswith('FIN')]
non_fin = [env for env in new_envs if not env.upper().endswith('FIN')]
# FIN envs must have manual selection
for env in fin_envs:
path = version_selection.get(env)
if not path:
missing.append(env)
else:
paths[env] = path
if missing:
st.sidebar.error(f"Please select a file version for: {', '.join(missing)}")
return
# Auto-load latest for non-FIN envs
if non_fin:
auto_paths = get_environments_paths(non_fin, base_path=base_path)
paths.update(auto_paths)
try:
dfs = []
loaded = []
failed = []
# Preprocess each new file, tracking success/failure
for env, path in paths.items():
try:
df = preprocess_uploaded_file(path)
dfs.append(df)
loaded.append((env, path))
except Exception as e:
failed.append((env, path, e))
# Show ticks for successful and failed loads
if loaded:
st.sidebar.markdown("**βœ… Successfully loaded:**")
for env, path in loaded:
st.sidebar.markdown(f"- βœ… {env}: `{path}`")
if failed:
st.sidebar.markdown("**❌ Failed to load:**")
for env, path, e in failed:
st.sidebar.markdown(f"- ❌ {env}: `{path}` ({e})")
# Update session state with new loaded data
for (env, _), df in zip(loaded, dfs):
st.session_state.uploaded_env_data[env] = df
st.session_state.loaded_envs.append(env)
# Build combined list of DataFrames for analysis
st.session_state.uploaded_data = list(st.session_state.uploaded_env_data.values())
except Exception as e:
st.sidebar.error(str(e))
# Main: run analysis if data is loaded
st.title("Multiple File Analysis (Auto Env Loader)")
if 'uploaded_data' in st.session_state and st.session_state.uploaded_data:
perform_analysis(st.session_state.uploaded_data)
else:
st.info("Use the sidebar to select environments and load their latest files for analysis.")
if __name__ == "__main__":
main()