SYMBOL INDEX (129 symbols across 24 files) FILE: core/engine.py function verify_credentials (line 29) | def verify_credentials( function test_permissions (line 80) | def test_permissions( function create_resource_inventory (line 183) | def create_resource_inventory( function create_cost_inventory (line 212) | def create_cost_inventory( function sync_assessment (line 236) | def sync_assessment( function perform_risk_assessment (line 324) | def perform_risk_assessment( function generate_report (line 421) | def generate_report( FILE: core/utils.py function copy_assets (line 9) | def copy_assets(report_path: str) -> None: FILE: core/utils_aws.py function aws_api_call_with_retry (line 20) | def aws_api_call_with_retry( function convert_datetime (line 52) | def convert_datetime(obj: Any) -> Any: function build_aws_resource_inventory (line 64) | def build_aws_resource_inventory( function get_missing_months_aws (line 201) | def get_missing_months_aws(processed_costs: Set[str], max_months: int) -... function build_aws_cost_inventory (line 217) | def build_aws_cost_inventory( FILE: core/utils_azure.py function is_resource_inventory_empty (line 22) | def is_resource_inventory_empty( function build_azure_resource_inventory (line 44) | def build_azure_resource_inventory( function get_missing_months_azure (line 136) | def get_missing_months_azure(processed_costs: Set[str], months_back: int... function build_azure_cost_inventory (line 159) | def build_azure_cost_inventory( FILE: core/utils_db.py function connect (line 13) | def connect(db_path=MASTER_DATABASE): function load_data (line 22) | def load_data(table_name, db_path=MASTER_DATABASE): function execute_query (line 36) | def execute_query(query, params=None, db_path=MASTER_DATABASE): function fetch_one (line 50) | def fetch_one(query, params=None, db_path=MASTER_DATABASE): function fetch_all (line 64) | def fetch_all(query, params=None, db_path=MASTER_DATABASE): FILE: core/utils_report.py function anonymize_string (line 53) | def anonymize_string(s: str, num_visible: int = 4) -> str: function generate_html_report (line 64) | def generate_html_report( function generate_json_report (line 162) | def generate_json_report( function generate_pdf_report (line 217) | def generate_pdf_report( FILE: core/utils_report_common.py function sort_cost_data (line 12) | def sort_cost_data(cost_data: List[Dict[str, Any]]) -> List[Dict[str, An... function summarize_costs (line 16) | def summarize_costs( function summarize_risks (line 39) | def summarize_risks( function summarize_alternative_technologies (line 117) | def summarize_alternative_technologies( function enrich_resource_inventory (line 156) | def enrich_resource_inventory( FILE: core/utils_report_html.py function transform_cost_inventory_for_html (line 16) | def transform_cost_inventory_for_html( function transform_risk_inventory_for_html (line 22) | def transform_risk_inventory_for_html( function transform_alt_tech_for_html (line 40) | def transform_alt_tech_for_html( FILE: core/utils_report_json.py function transform_resource_inventory_for_json (line 17) | def transform_resource_inventory_for_json( function transform_cost_inventory_for_json (line 36) | def transform_cost_inventory_for_json( function transform_risk_inventory_for_json (line 52) | def transform_risk_inventory_for_json( function transform_alt_tech_for_json (line 79) | def transform_alt_tech_for_json( FILE: core/utils_report_pdf.py function transform_resource_inventory_for_pdf (line 36) | def transform_resource_inventory_for_pdf( function transform_cost_inventory_for_pdf (line 56) | def transform_cost_inventory_for_pdf( function transform_risk_inventory_for_pdf (line 63) | def transform_risk_inventory_for_pdf( function transform_alt_tech_for_pdf (line 77) | def transform_alt_tech_for_pdf( function draw_header_footer (line 114) | def draw_header_footer(report_path: str, canvas, doc) -> None: function draw_risk_chart (line 206) | def draw_risk_chart(risk_chart_data: Dict[str, int]) -> Drawing: function draw_cost_chart (line 283) | def draw_cost_chart(months: List[str], costs: List[float]) -> Drawing: function draw_exitscore_chart (line 316) | def draw_exitscore_chart( function draw_vendor_lockin_radar_chart (line 345) | def draw_vendor_lockin_radar_chart( FILE: core/utils_sync.py function _assess_url (line 21) | def _assess_url(host: str) -> str: function _build_payload (line 28) | def _build_payload( function post_assessment (line 87) | def post_assessment( FILE: main.py function handle_aws (line 60) | def handle_aws(args): function handle_azure (line 172) | def handle_azure(args): function run_assessment (line 332) | def run_assessment(config, provider_name): function parse_arguments (line 573) | def parse_arguments(): function main (line 627) | def main(): FILE: tests/report_fixtures.py function build_report_fixture (line 5) | def build_report_fixture(): function build_empty_report_fixture (line 76) | def build_empty_report_fixture(): function stage_report_assets (line 103) | def stage_report_assets(report_path: str) -> None: FILE: tests/test_report_pipeline.py class ReportPipelineSmokeTests (line 19) | class ReportPipelineSmokeTests(unittest.TestCase): method test_generate_html_report_creates_expected_output (line 20) | def test_generate_html_report_creates_expected_output(self): method test_generate_html_report_renders_empty_state_output (line 46) | def test_generate_html_report_renders_empty_state_output(self): method test_generate_json_report_creates_expected_structure (line 79) | def test_generate_json_report_creates_expected_structure(self): method test_generate_pdf_report_creates_non_empty_file (line 112) | def test_generate_pdf_report_creates_non_empty_file(self): class ReportTransformTests (line 139) | class ReportTransformTests(unittest.TestCase): method test_transform_cost_inventory_for_json_sorts_months (line 140) | def test_transform_cost_inventory_for_json_sorts_months(self): FILE: tests/test_report_transforms.py function build_resource_type_mapping (line 22) | def build_resource_type_mapping(): function build_resource_inventory (line 39) | def build_resource_inventory(): function build_risk_definitions (line 46) | def build_risk_definitions(): function build_risk_data (line 63) | def build_risk_data(): function build_alternatives (line 71) | def build_alternatives(): function build_alternative_technologies (line 79) | def build_alternative_technologies(): class HtmlTransformTests (line 111) | class HtmlTransformTests(unittest.TestCase): method test_transform_cost_inventory_for_html_sorts_and_sums_costs (line 112) | def test_transform_cost_inventory_for_html_sorts_and_sums_costs(self): method test_transform_risk_inventory_for_html_counts_overall_and_resource_risks (line 128) | def test_transform_risk_inventory_for_html_counts_overall_and_resource... method test_transform_alt_tech_for_html_filters_by_strategy_and_status (line 148) | def test_transform_alt_tech_for_html_filters_by_strategy_and_status(se... class JsonTransformTests (line 163) | class JsonTransformTests(unittest.TestCase): method test_transform_resource_inventory_for_json_maps_names_and_codes (line 164) | def test_transform_resource_inventory_for_json_maps_names_and_codes(se... method test_transform_risk_inventory_for_json_maps_impacted_resource_ids (line 176) | def test_transform_risk_inventory_for_json_maps_impacted_resource_ids(... method test_transform_alt_tech_for_json_groups_by_resource_id (line 188) | def test_transform_alt_tech_for_json_groups_by_resource_id(self): class PdfTransformTests (line 201) | class PdfTransformTests(unittest.TestCase): method test_transform_cost_inventory_for_pdf_limits_to_last_six_months (line 202) | def test_transform_cost_inventory_for_pdf_limits_to_last_six_months(se... method test_transform_risk_inventory_for_pdf_counts_resource_backed_risks (line 219) | def test_transform_risk_inventory_for_pdf_counts_resource_backed_risks... method test_transform_resource_inventory_for_pdf_builds_report_relative_icon_paths (line 235) | def test_transform_resource_inventory_for_pdf_builds_report_relative_i... method test_transform_alt_tech_for_pdf_counts_matching_alternatives (line 250) | def test_transform_alt_tech_for_pdf_counts_matching_alternatives(self): FILE: tests/test_utils_and_main.py class LoadConfigTests (line 11) | class LoadConfigTests(unittest.TestCase): method test_load_config_returns_parsed_json (line 12) | def test_load_config_returns_parsed_json(self): method test_load_config_returns_none_for_missing_file (line 24) | def test_load_config_returns_none_for_missing_file(self): method test_load_config_returns_none_for_invalid_json (line 31) | def test_load_config_returns_none_for_invalid_json(self): class RunAssessmentPreValidationTests (line 43) | class RunAssessmentPreValidationTests(unittest.TestCase): method test_invalid_config_stops_before_pipeline_side_effects (line 44) | def test_invalid_config_stops_before_pipeline_side_effects(self): FILE: tests/test_validate.py function build_aws_config (line 6) | def build_aws_config(): function build_azure_config (line 20) | def build_azure_config(): class ValidateRegionTests (line 36) | class ValidateRegionTests(unittest.TestCase): method test_accepts_known_region (line 37) | def test_accepts_known_region(self): method test_rejects_unknown_region (line 40) | def test_rejects_unknown_region(self): class ValidateConfigTests (line 45) | class ValidateConfigTests(unittest.TestCase): method test_accepts_valid_aws_config (line 46) | def test_accepts_valid_aws_config(self): method test_accepts_valid_azure_service_principal_config (line 49) | def test_accepts_valid_azure_service_principal_config(self): method test_accepts_valid_azure_cli_config (line 52) | def test_accepts_valid_azure_cli_config(self): method test_rejects_azure_config_without_client_credentials (line 63) | def test_rejects_azure_config_without_client_credentials(self): method test_rejects_invalid_assessment_type (line 73) | def test_rejects_invalid_assessment_type(self): method test_rejects_non_integer_top_level_fields (line 80) | def test_rejects_non_integer_top_level_fields(self): method test_rejects_invalid_name_characters (line 87) | def test_rejects_invalid_name_characters(self): method test_rejects_too_long_name (line 96) | def test_rejects_too_long_name(self): method test_rejects_aws_config_with_invalid_region (line 103) | def test_rejects_aws_config_with_invalid_region(self): FILE: utils/aws.py function is_aws_cli_installed (line 9) | def is_aws_cli_installed() -> bool: function is_aws_profile_valid (line 13) | def is_aws_profile_valid(profile: str) -> bool: FILE: utils/azure.py function is_azure_cli_installed (line 14) | def is_azure_cli_installed() -> bool: function is_azure_cli_logged_in (line 18) | def is_azure_cli_logged_in() -> bool: function is_azure_cli_token_expired (line 32) | def is_azure_cli_token_expired() -> bool: function select_subscription (line 43) | def select_subscription(subscriptions: List[Any]) -> Any: function select_resource_group (line 61) | def select_resource_group(resource_groups: List[Any]) -> str: FILE: utils/connection.py function _build_url (line 18) | def _build_url(host: str) -> str: function get_jwt_token (line 25) | def get_jwt_token( function resolve_mode (line 66) | def resolve_mode() -> Tuple[str, Optional[str]]: FILE: utils/data.py function get_monday_date (line 18) | def get_monday_date() -> str: function compute_file_hash (line 29) | def compute_file_hash(filepath: str) -> str: function download_file (line 37) | def download_file(url: str, destination: str, retries: int = 3, delay: i... function fetch_remote_checksum (line 67) | def fetch_remote_checksum( function initialize_dataset (line 94) | def initialize_dataset() -> None: FILE: utils/sync.py function _build_url (line 15) | def _build_url(host: str) -> str: function submit_assessment (line 22) | def submit_assessment( FILE: utils/utils.py function load_config (line 15) | def load_config(file_path: str) -> Optional[Dict[str, Any]]: function prompt_required_inputs (line 28) | def prompt_required_inputs() -> Tuple[int, int]: function print_step (line 62) | def print_step( function create_directory (line 109) | def create_directory(base_path="reports"): function print_help_message (line 124) | def print_help_message(): FILE: utils/validate.py function validate_region (line 6) | def validate_region(region: str) -> None: function validate_config (line 12) | def validate_config(config: Dict[str, Any]) -> bool: