File size: 7,703 Bytes
a089b0d
 
 
 
94c0fea
ca3af14
83c336a
42c5a14
853735a
a089b0d
 
 
83c336a
a089b0d
 
94c0fea
ca3af14
a089b0d
 
 
 
 
aad0805
 
 
 
 
 
 
 
a089b0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aad0805
 
150662b
aad0805
 
 
 
150662b
aad0805
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83c336a
aad0805
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a089b0d
 
 
 
 
83c336a
42c5a14
94c0fea
83c336a
94c0fea
ca3af14
94c0fea
83c336a
853735a
83c336a
 
 
 
 
94c0fea
 
 
 
ca3af14
 
83c336a
94c0fea
 
 
 
83c336a
 
 
 
853735a
 
a089b0d
 
853735a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import pandas as pd
import streamlit as st
import matplotlib.pyplot as plt
import numpy as np
from second import double_main
from multiple import multiple_main
from weekly import generate_weekly_report
from pre import preprocess_uploaded_file, add_app_description
from multi_env_compare import multi_env_compare_main 



def single_main(uploaded_file):     

    if uploaded_file is not None:
       # Process the csv files with header
        data = preprocess_uploaded_file(uploaded_file)
        # st.write(data)

       # Display scenarios with status "failed" grouped by functional area
        failed_scenarios = data[data['Status'] == 'FAILED']
        passed_scenarios = data[data['Status'] == 'PASSED']

        # Display total count of failures
        fail_count = len(failed_scenarios)
        st.markdown(f"Failing scenarios Count: {fail_count}")
        # Display total count of Passing
        pass_count = len(passed_scenarios)
        st.markdown(f"Passing scenarios Count: {pass_count}")

         # Use radio buttons for selecting status
        selected_status = st.radio("Select a status", ['Failed', 'Passed'])

        # Determine which scenarios to display based on selected status
        if selected_status == 'Failed':
            unique_areas = np.append(failed_scenarios['Functional area'].unique(), "All")
            selected_scenarios = failed_scenarios
        elif selected_status == 'Passed':
            unique_areas = np.append(passed_scenarios['Functional area'].unique(), "All")
            selected_scenarios = passed_scenarios
        else:  
            selected_scenarios = None
        
        if selected_scenarios is not None:
            # st.write(f"Scenarios with status '{selected_status}' grouped by functional area:")
            st.markdown(f"### Scenarios with status '{selected_status}' grouped by functional area:")
            
            # Select a range of functional areas to filter scenarios
            selected_functional_areas = st.multiselect("Select functional areas", unique_areas, ["All"])
           
            if "All" in selected_functional_areas:
                filtered_scenarios = selected_scenarios
            else:
                filtered_scenarios = selected_scenarios[selected_scenarios['Functional area'].isin(selected_functional_areas)]
            
            if not selected_functional_areas:  # Check if the list is empty
                st.error("Please select at least one functional area.")
            else:
             # Calculate the average time spent for each functional area
                average_time_spent_seconds = filtered_scenarios.groupby('Functional area')['Time spent'].mean().reset_index()

                # Convert average time spent from seconds to minutes and seconds format
                average_time_spent_seconds['Time spent'] = pd.to_datetime(average_time_spent_seconds['Time spent'], unit='s').dt.strftime('%M:%S')

                # Group by functional area and get the start datetime for sorting
                start_datetime_group = filtered_scenarios.groupby('Functional area')['Start datetime'].min().reset_index()

                # Merge average_time_spent_seconds and start_datetime_group
                average_time_spent_seconds = average_time_spent_seconds.merge(start_datetime_group, on='Functional area')

                # Filter scenarios based on selected functional area
                if selected_status == 'Failed':
                    grouped_filtered_scenarios = filtered_scenarios.groupby('Functional area')[['Scenario name', 'Error message','Time spent(m:s)']].apply(lambda x: x.reset_index(drop=True))
                elif selected_status == 'Passed':
                    grouped_filtered_scenarios = filtered_scenarios.groupby('Functional area')[['Scenario name', 'Time spent(m:s)']].apply(lambda x: x.reset_index(drop=True))
                else:  
                    grouped_filtered_scenarios = None


                grouped_filtered_scenarios.reset_index(inplace=True)
                grouped_filtered_scenarios.drop(columns=['level_1'], inplace=True)
                grouped_filtered_scenarios.index = grouped_filtered_scenarios.index + 1

                st.markdown(grouped_filtered_scenarios)  

                # Sort the average time spent table by start datetime
                average_time_spent_seconds = average_time_spent_seconds.sort_values(by='Start datetime')

               # Display average time spent on each functional area in a table
                st.markdown("### Average Time Spent on Each Functional Area")
                average_time_spent_seconds.index = average_time_spent_seconds.index + 1
                st.dataframe(average_time_spent_seconds)

                # Check if selected_status is 'Failed' and grouped_filtered_scenarios length is less than or equal to 400
                if selected_status != 'Passed' and len(grouped_filtered_scenarios) <= 400:
                    # Create and display bar graph of errors by functional area
                    st.write(f"### Bar graph showing number of '{selected_status}' scenarios in each functional area:")
                    error_counts = grouped_filtered_scenarios['Functional area'].value_counts()
                    plt.figure(figsize=(10, 6))
                    plt.bar(error_counts.index, error_counts.values)
                    plt.xlabel('Functional Area')
                    plt.ylabel('Number of Failures')
                    plt.title(f"Number of '{selected_status}' scenarios by Functional Area")
                    plt.xticks(rotation=45, ha='right')

                    # Set y-axis limits and ticks for consistent interval of 1
                    y_max = max(error_counts.values) + 1
                    plt.ylim(0, y_max)
                    plt.yticks(range(0, y_max, 1))

                    # Display individual numbers on y-axis
                    for i, count in enumerate(error_counts.values):
                        plt.text(i, count, str(count), ha='center', va='bottom')

                    plt.tight_layout()  # Add this line to adjust layout
                    st.pyplot(plt)      
        else:
            st.write("### No scenarios with status 'failed' found.")  
    pass

def main():

    add_app_description()

   # Initially we are in multi file processing mode
    if "mode" not in st.session_state:
        st.session_state["mode"] = "multi"

    # Add a dropdown for mode selection
    selected_mode = st.sidebar.selectbox("Select Mode", ["Multi", "Compare", "Weekly", "Multi-Env Compare"])

    # Update the mode based on the selection
    st.session_state["mode"] = selected_mode.lower()

    # Display the selected mode
    mode_display = f'## Current mode: {st.session_state["mode"].title()} mode'
    st.sidebar.markdown(mode_display)

    # Only show the second file uploader in compare mode
    if st.session_state["mode"] == "multi":
        multiple_main()
    elif st.session_state["mode"] == "compare":
        uploaded_file_1 = st.sidebar.file_uploader("Upload CSV file 1", type="csv")
        uploaded_file_2 = st.sidebar.file_uploader("Upload CSV file 2", type="csv")
        if uploaded_file_1 is not None and uploaded_file_2 is not None:
            double_main(uploaded_file_1, uploaded_file_2)
    elif st.session_state["mode"] == "weekly":
        uploaded_files = st.sidebar.file_uploader("Upload CSV files for Weekly Report", type="csv", accept_multiple_files=True)
        if uploaded_files:
            generate_weekly_report(uploaded_files)
    elif st.session_state["mode"] == "multi-env compare":  # Add new mode
        multi_env_compare_main()

if __name__ == "__main__":
    main()