Convert filename to readable workflow name.
(self, filename: str)
| 116 | return hash_md5.hexdigest() |
| 117 | |
| 118 | def format_workflow_name(self, filename: str) -> str: |
| 119 | """Convert filename to readable workflow name.""" |
| 120 | # Remove .json extension |
| 121 | name = filename.replace(".json", "") |
| 122 | |
| 123 | # Split by underscores |
| 124 | parts = name.split("_") |
| 125 | |
| 126 | # Skip the first part if it's just a number |
| 127 | if len(parts) > 1 and parts[0].isdigit(): |
| 128 | parts = parts[1:] |
| 129 | |
| 130 | # Convert parts to title case and join with spaces |
| 131 | readable_parts = [] |
| 132 | for part in parts: |
| 133 | # Special handling for common terms |
| 134 | if part.lower() == "http": |
| 135 | readable_parts.append("HTTP") |
| 136 | elif part.lower() == "api": |
| 137 | readable_parts.append("API") |
| 138 | elif part.lower() == "webhook": |
| 139 | readable_parts.append("Webhook") |
| 140 | elif part.lower() == "automation": |
| 141 | readable_parts.append("Automation") |
| 142 | elif part.lower() == "automate": |
| 143 | readable_parts.append("Automate") |
| 144 | elif part.lower() == "scheduled": |
| 145 | readable_parts.append("Scheduled") |
| 146 | elif part.lower() == "triggered": |
| 147 | readable_parts.append("Triggered") |
| 148 | elif part.lower() == "manual": |
| 149 | readable_parts.append("Manual") |
| 150 | else: |
| 151 | # Capitalize first letter |
| 152 | readable_parts.append(part.capitalize()) |
| 153 | |
| 154 | return " ".join(readable_parts) |
| 155 | |
| 156 | def analyze_workflow_file(self, file_path: str) -> Optional[Dict[str, Any]]: |
| 157 | """Analyze a single workflow file and extract metadata.""" |
no outgoing calls
no test coverage detected