syncable_cli/analyzer/frameworks/
python.rs

1use super::{LanguageFrameworkDetector, TechnologyRule, FrameworkDetectionUtils};
2use crate::analyzer::{DetectedTechnology, DetectedLanguage, TechnologyCategory, LibraryType};
3use crate::error::Result;
4
5pub struct PythonFrameworkDetector;
6
7impl LanguageFrameworkDetector for PythonFrameworkDetector {
8    fn detect_frameworks(&self, language: &DetectedLanguage) -> Result<Vec<DetectedTechnology>> {
9        let rules = get_python_technology_rules();
10        
11        // Combine main and dev dependencies for comprehensive detection
12        let all_deps: Vec<String> = language.main_dependencies.iter()
13            .chain(language.dev_dependencies.iter())
14            .cloned()
15            .collect();
16        
17        let technologies = FrameworkDetectionUtils::detect_technologies_by_dependencies(
18            &rules, &all_deps, language.confidence
19        );
20        
21        Ok(technologies)
22    }
23    
24    fn supported_languages(&self) -> Vec<&'static str> {
25        vec!["Python"]
26    }
27}
28
29/// Python technology detection rules with comprehensive framework coverage
30fn get_python_technology_rules() -> Vec<TechnologyRule> {
31    vec![
32        // WEB FRAMEWORKS - Full Stack
33        TechnologyRule {
34            name: "Django".to_string(),
35            category: TechnologyCategory::BackendFramework,
36            confidence: 0.95,
37            dependency_patterns: vec!["django".to_string(), "Django".to_string()],
38            requires: vec![],
39            conflicts_with: vec![],
40            is_primary_indicator: true,
41            alternative_names: vec![],
42        },
43        TechnologyRule {
44            name: "Django REST Framework".to_string(),
45            category: TechnologyCategory::BackendFramework,
46            confidence: 0.90,
47            dependency_patterns: vec!["djangorestframework".to_string(), "rest_framework".to_string()],
48            requires: vec!["Django".to_string()],
49            conflicts_with: vec![],
50            is_primary_indicator: false,
51            alternative_names: vec!["DRF".to_string()],
52        },
53        
54        // MICRO FRAMEWORKS
55        TechnologyRule {
56            name: "Flask".to_string(),
57            category: TechnologyCategory::BackendFramework,
58            confidence: 0.95,
59            dependency_patterns: vec!["flask".to_string(), "Flask".to_string()],
60            requires: vec![],
61            conflicts_with: vec![],
62            is_primary_indicator: true,
63            alternative_names: vec![],
64        },
65        TechnologyRule {
66            name: "FastAPI".to_string(),
67            category: TechnologyCategory::BackendFramework,
68            confidence: 0.95,
69            dependency_patterns: vec!["fastapi".to_string()],
70            requires: vec![],
71            conflicts_with: vec![],
72            is_primary_indicator: true,
73            alternative_names: vec![],
74        },
75        TechnologyRule {
76            name: "Starlette".to_string(),
77            category: TechnologyCategory::BackendFramework,
78            confidence: 0.90,
79            dependency_patterns: vec!["starlette".to_string()],
80            requires: vec![],
81            conflicts_with: vec![],
82            is_primary_indicator: true,
83            alternative_names: vec![],
84        },
85        TechnologyRule {
86            name: "Quart".to_string(),
87            category: TechnologyCategory::BackendFramework,
88            confidence: 0.90,
89            dependency_patterns: vec!["quart".to_string()],
90            requires: vec![],
91            conflicts_with: vec![],
92            is_primary_indicator: true,
93            alternative_names: vec![],
94        },
95        TechnologyRule {
96            name: "Sanic".to_string(),
97            category: TechnologyCategory::BackendFramework,
98            confidence: 0.90,
99            dependency_patterns: vec!["sanic".to_string()],
100            requires: vec![],
101            conflicts_with: vec![],
102            is_primary_indicator: true,
103            alternative_names: vec![],
104        },
105        TechnologyRule {
106            name: "Tornado".to_string(),
107            category: TechnologyCategory::BackendFramework,
108            confidence: 0.90,
109            dependency_patterns: vec!["tornado".to_string()],
110            requires: vec![],
111            conflicts_with: vec![],
112            is_primary_indicator: true,
113            alternative_names: vec![],
114        },
115        TechnologyRule {
116            name: "Falcon".to_string(),
117            category: TechnologyCategory::BackendFramework,
118            confidence: 0.90,
119            dependency_patterns: vec!["falcon".to_string()],
120            requires: vec![],
121            conflicts_with: vec![],
122            is_primary_indicator: true,
123            alternative_names: vec![],
124        },
125        TechnologyRule {
126            name: "Bottle".to_string(),
127            category: TechnologyCategory::BackendFramework,
128            confidence: 0.90,
129            dependency_patterns: vec!["bottle".to_string()],
130            requires: vec![],
131            conflicts_with: vec![],
132            is_primary_indicator: true,
133            alternative_names: vec![],
134        },
135        TechnologyRule {
136            name: "aiohttp".to_string(),
137            category: TechnologyCategory::BackendFramework,
138            confidence: 0.90,
139            dependency_patterns: vec!["aiohttp".to_string()],
140            requires: vec![],
141            conflicts_with: vec![],
142            is_primary_indicator: true,
143            alternative_names: vec![],
144        },
145        TechnologyRule {
146            name: "CherryPy".to_string(),
147            category: TechnologyCategory::BackendFramework,
148            confidence: 0.90,
149            dependency_patterns: vec!["cherrypy".to_string(), "CherryPy".to_string()],
150            requires: vec![],
151            conflicts_with: vec![],
152            is_primary_indicator: true,
153            alternative_names: vec![],
154        },
155        TechnologyRule {
156            name: "Pyramid".to_string(),
157            category: TechnologyCategory::BackendFramework,
158            confidence: 0.90,
159            dependency_patterns: vec!["pyramid".to_string()],
160            requires: vec![],
161            conflicts_with: vec![],
162            is_primary_indicator: true,
163            alternative_names: vec![],
164        },
165        TechnologyRule {
166            name: "TurboGears".to_string(),
167            category: TechnologyCategory::BackendFramework,
168            confidence: 0.90,
169            dependency_patterns: vec!["turbogears".to_string(), "tg".to_string()],
170            requires: vec![],
171            conflicts_with: vec![],
172            is_primary_indicator: true,
173            alternative_names: vec!["TG".to_string()],
174        },
175        TechnologyRule {
176            name: "Web2py".to_string(),
177            category: TechnologyCategory::BackendFramework,
178            confidence: 0.90,
179            dependency_patterns: vec!["web2py".to_string()],
180            requires: vec![],
181            conflicts_with: vec![],
182            is_primary_indicator: true,
183            alternative_names: vec![],
184        },
185        TechnologyRule {
186            name: "BlueBream".to_string(),
187            category: TechnologyCategory::BackendFramework,
188            confidence: 0.85,
189            dependency_patterns: vec!["bluebream".to_string(), "zope.app".to_string()],
190            requires: vec![],
191            conflicts_with: vec![],
192            is_primary_indicator: true,
193            alternative_names: vec!["Zope3".to_string()],
194        },
195        TechnologyRule {
196            name: "Hug".to_string(),
197            category: TechnologyCategory::BackendFramework,
198            confidence: 0.90,
199            dependency_patterns: vec!["hug".to_string()],
200            requires: vec![],
201            conflicts_with: vec![],
202            is_primary_indicator: true,
203            alternative_names: vec![],
204        },
205        TechnologyRule {
206            name: "BlackSheep".to_string(),
207            category: TechnologyCategory::BackendFramework,
208            confidence: 0.90,
209            dependency_patterns: vec!["blacksheep".to_string()],
210            requires: vec![],
211            conflicts_with: vec![],
212            is_primary_indicator: true,
213            alternative_names: vec![],
214        },
215        TechnologyRule {
216            name: "Litestar".to_string(),
217            category: TechnologyCategory::BackendFramework,
218            confidence: 0.90,
219            dependency_patterns: vec!["litestar".to_string()],
220            requires: vec![],
221            conflicts_with: vec![],
222            is_primary_indicator: true,
223            alternative_names: vec![],
224        },
225        TechnologyRule {
226            name: "Muffin".to_string(),
227            category: TechnologyCategory::BackendFramework,
228            confidence: 0.85,
229            dependency_patterns: vec!["muffin".to_string()],
230            requires: vec![],
231            conflicts_with: vec![],
232            is_primary_indicator: true,
233            alternative_names: vec![],
234        },
235
236        // DATA SCIENCE FRAMEWORKS (Important for containerization/deployment)
237        TechnologyRule {
238            name: "Streamlit".to_string(),
239            category: TechnologyCategory::BackendFramework,
240            confidence: 0.95,
241            dependency_patterns: vec!["streamlit".to_string()],
242            requires: vec![],
243            conflicts_with: vec![],
244            is_primary_indicator: true,
245            alternative_names: vec![],
246        },
247        TechnologyRule {
248            name: "Gradio".to_string(),
249            category: TechnologyCategory::BackendFramework,
250            confidence: 0.95,
251            dependency_patterns: vec!["gradio".to_string()],
252            requires: vec![],
253            conflicts_with: vec![],
254            is_primary_indicator: true,
255            alternative_names: vec![],
256        },
257        TechnologyRule {
258            name: "Dash".to_string(),
259            category: TechnologyCategory::BackendFramework,
260            confidence: 0.95,
261            dependency_patterns: vec!["dash".to_string(), "plotly-dash".to_string()],
262            requires: vec![],
263            conflicts_with: vec![],
264            is_primary_indicator: true,
265            alternative_names: vec!["Plotly Dash".to_string()],
266        },
267        TechnologyRule {
268            name: "Reflex".to_string(),
269            category: TechnologyCategory::BackendFramework,
270            confidence: 0.95,
271            dependency_patterns: vec!["reflex".to_string(), "pynecone".to_string()],
272            requires: vec![],
273            conflicts_with: vec![],
274            is_primary_indicator: true,
275            alternative_names: vec!["Pynecone".to_string()],
276        },
277        TechnologyRule {
278            name: "Jupyter".to_string(),
279            category: TechnologyCategory::Library(LibraryType::Utility),
280            confidence: 0.85,
281            dependency_patterns: vec!["jupyter".to_string(), "jupyterlab".to_string(), "notebook".to_string()],
282            requires: vec![],
283            conflicts_with: vec![],
284            is_primary_indicator: false,
285            alternative_names: vec!["JupyterLab".to_string()],
286        },
287        
288        // DATABASE/ORM
289        TechnologyRule {
290            name: "SQLAlchemy".to_string(),
291            category: TechnologyCategory::Database,
292            confidence: 0.90,
293            dependency_patterns: vec!["sqlalchemy".to_string(), "SQLAlchemy".to_string()],
294            requires: vec![],
295            conflicts_with: vec![],
296            is_primary_indicator: false,
297            alternative_names: vec![],
298        },
299        TechnologyRule {
300            name: "Peewee".to_string(),
301            category: TechnologyCategory::Database,
302            confidence: 0.90,
303            dependency_patterns: vec!["peewee".to_string()],
304            requires: vec![],
305            conflicts_with: vec![],
306            is_primary_indicator: false,
307            alternative_names: vec![],
308        },
309        TechnologyRule {
310            name: "Tortoise ORM".to_string(),
311            category: TechnologyCategory::Database,
312            confidence: 0.90,
313            dependency_patterns: vec!["tortoise-orm".to_string()],
314            requires: vec![],
315            conflicts_with: vec![],
316            is_primary_indicator: false,
317            alternative_names: vec!["tortoise".to_string()],
318        },
319        TechnologyRule {
320            name: "Django ORM".to_string(),
321            category: TechnologyCategory::Database,
322            confidence: 0.95,
323            dependency_patterns: vec!["django.db".to_string()],
324            requires: vec!["Django".to_string()],
325            conflicts_with: vec![],
326            is_primary_indicator: false,
327            alternative_names: vec![],
328        },
329        TechnologyRule {
330            name: "SQLModel".to_string(),
331            category: TechnologyCategory::Database,
332            confidence: 0.90,
333            dependency_patterns: vec!["sqlmodel".to_string()],
334            requires: vec![],
335            conflicts_with: vec![],
336            is_primary_indicator: false,
337            alternative_names: vec![],
338        },
339        TechnologyRule {
340            name: "Databases".to_string(),
341            category: TechnologyCategory::Database,
342            confidence: 0.85,
343            dependency_patterns: vec!["databases".to_string()],
344            requires: vec![],
345            conflicts_with: vec![],
346            is_primary_indicator: false,
347            alternative_names: vec![],
348        },
349        TechnologyRule {
350            name: "Alembic".to_string(),
351            category: TechnologyCategory::Database,
352            confidence: 0.85,
353            dependency_patterns: vec!["alembic".to_string()],
354            requires: vec!["SQLAlchemy".to_string()],
355            conflicts_with: vec![],
356            is_primary_indicator: false,
357            alternative_names: vec![],
358        },
359        TechnologyRule {
360            name: "Psycopg2".to_string(),
361            category: TechnologyCategory::Database,
362            confidence: 0.85,
363            dependency_patterns: vec!["psycopg2".to_string(), "psycopg2-binary".to_string()],
364            requires: vec![],
365            conflicts_with: vec![],
366            is_primary_indicator: false,
367            alternative_names: vec![],
368        },
369        TechnologyRule {
370            name: "Asyncpg".to_string(),
371            category: TechnologyCategory::Database,
372            confidence: 0.85,
373            dependency_patterns: vec!["asyncpg".to_string()],
374            requires: vec![],
375            conflicts_with: vec![],
376            is_primary_indicator: false,
377            alternative_names: vec![],
378        },
379        TechnologyRule {
380            name: "PyMongo".to_string(),
381            category: TechnologyCategory::Database,
382            confidence: 0.90,
383            dependency_patterns: vec!["pymongo".to_string()],
384            requires: vec![],
385            conflicts_with: vec![],
386            is_primary_indicator: false,
387            alternative_names: vec![],
388        },
389        TechnologyRule {
390            name: "Motor".to_string(),
391            category: TechnologyCategory::Database,
392            confidence: 0.90,
393            dependency_patterns: vec!["motor".to_string()],
394            requires: vec![],
395            conflicts_with: vec![],
396            is_primary_indicator: false,
397            alternative_names: vec![],
398        },
399        TechnologyRule {
400            name: "Beanie".to_string(),
401            category: TechnologyCategory::Database,
402            confidence: 0.90,
403            dependency_patterns: vec!["beanie".to_string()],
404            requires: vec!["Motor".to_string()],
405            conflicts_with: vec![],
406            is_primary_indicator: false,
407            alternative_names: vec![],
408        },
409        TechnologyRule {
410            name: "MongoEngine".to_string(),
411            category: TechnologyCategory::Database,
412            confidence: 0.85,
413            dependency_patterns: vec!["mongoengine".to_string()],
414            requires: vec![],
415            conflicts_with: vec![],
416            is_primary_indicator: false,
417            alternative_names: vec![],
418        },
419        TechnologyRule {
420            name: "Redis-py".to_string(),
421            category: TechnologyCategory::Database,
422            confidence: 0.85,
423            dependency_patterns: vec!["redis".to_string()],
424            requires: vec![],
425            conflicts_with: vec![],
426            is_primary_indicator: false,
427            alternative_names: vec!["redis-py".to_string()],
428        },
429        TechnologyRule {
430            name: "Pydantic".to_string(),
431            category: TechnologyCategory::Library(LibraryType::Utility),
432            confidence: 0.85,
433            dependency_patterns: vec!["pydantic".to_string()],
434            requires: vec![],
435            conflicts_with: vec![],
436            is_primary_indicator: false,
437            alternative_names: vec![],
438        },
439        TechnologyRule {
440            name: "Marshmallow".to_string(),
441            category: TechnologyCategory::Library(LibraryType::Utility),
442            confidence: 0.85,
443            dependency_patterns: vec!["marshmallow".to_string()],
444            requires: vec![],
445            conflicts_with: vec![],
446            is_primary_indicator: false,
447            alternative_names: vec![],
448        },
449        
450        // ASYNC FRAMEWORKS & UTILITIES
451        TechnologyRule {
452            name: "asyncio".to_string(),
453            category: TechnologyCategory::Runtime,
454            confidence: 0.85,
455            dependency_patterns: vec!["asyncio".to_string()],
456            requires: vec![],
457            conflicts_with: vec![],
458            is_primary_indicator: false,
459            alternative_names: vec![],
460        },
461        TechnologyRule {
462            name: "aiofiles".to_string(),
463            category: TechnologyCategory::Library(LibraryType::Utility),
464            confidence: 0.85,
465            dependency_patterns: vec!["aiofiles".to_string()],
466            requires: vec![],
467            conflicts_with: vec![],
468            is_primary_indicator: false,
469            alternative_names: vec![],
470        },
471        
472        // DATA SCIENCE LIBRARIES (Important for containerization/deployment)
473        TechnologyRule {
474            name: "NumPy".to_string(),
475            category: TechnologyCategory::Library(LibraryType::Utility),
476            confidence: 0.85,
477            dependency_patterns: vec!["numpy".to_string()],
478            requires: vec![],
479            conflicts_with: vec![],
480            is_primary_indicator: false,
481            alternative_names: vec![],
482        },
483        TechnologyRule {
484            name: "Pandas".to_string(),
485            category: TechnologyCategory::Library(LibraryType::Utility),
486            confidence: 0.85,
487            dependency_patterns: vec!["pandas".to_string()],
488            requires: vec![],
489            conflicts_with: vec![],
490            is_primary_indicator: false,
491            alternative_names: vec![],
492        },
493        TechnologyRule {
494            name: "Scikit-learn".to_string(),
495            category: TechnologyCategory::Library(LibraryType::Utility),
496            confidence: 0.85,
497            dependency_patterns: vec!["scikit-learn".to_string(), "sklearn".to_string()],
498            requires: vec![],
499            conflicts_with: vec![],
500            is_primary_indicator: false,
501            alternative_names: vec!["sklearn".to_string()],
502        },
503        TechnologyRule {
504            name: "TensorFlow".to_string(),
505            category: TechnologyCategory::Library(LibraryType::Utility),
506            confidence: 0.90,
507            dependency_patterns: vec!["tensorflow".to_string()],
508            requires: vec![],
509            conflicts_with: vec![],
510            is_primary_indicator: false,
511            alternative_names: vec![],
512        },
513        TechnologyRule {
514            name: "PyTorch".to_string(),
515            category: TechnologyCategory::Library(LibraryType::Utility),
516            confidence: 0.90,
517            dependency_patterns: vec!["torch".to_string(), "pytorch".to_string()],
518            requires: vec![],
519            conflicts_with: vec![],
520            is_primary_indicator: false,
521            alternative_names: vec!["torch".to_string()],
522        },
523        TechnologyRule {
524            name: "Matplotlib".to_string(),
525            category: TechnologyCategory::Library(LibraryType::Utility),
526            confidence: 0.80,
527            dependency_patterns: vec!["matplotlib".to_string()],
528            requires: vec![],
529            conflicts_with: vec![],
530            is_primary_indicator: false,
531            alternative_names: vec![],
532        },
533        TechnologyRule {
534            name: "Plotly".to_string(),
535            category: TechnologyCategory::Library(LibraryType::Utility),
536            confidence: 0.80,
537            dependency_patterns: vec!["plotly".to_string()],
538            requires: vec![],
539            conflicts_with: vec![],
540            is_primary_indicator: false,
541            alternative_names: vec![],
542        },
543        TechnologyRule {
544            name: "Seaborn".to_string(),
545            category: TechnologyCategory::Library(LibraryType::Utility),
546            confidence: 0.80,
547            dependency_patterns: vec!["seaborn".to_string()],
548            requires: vec![],
549            conflicts_with: vec![],
550            is_primary_indicator: false,
551            alternative_names: vec![],
552        },
553        
554        // TASK QUEUES (Important for architecture)
555        TechnologyRule {
556            name: "Celery".to_string(),
557            category: TechnologyCategory::Library(LibraryType::Utility),
558            confidence: 0.90,
559            dependency_patterns: vec!["celery".to_string()],
560            requires: vec![],
561            conflicts_with: vec![],
562            is_primary_indicator: false,
563            alternative_names: vec![],
564        },
565        TechnologyRule {
566            name: "RQ".to_string(),
567            category: TechnologyCategory::Library(LibraryType::Utility),
568            confidence: 0.90,
569            dependency_patterns: vec!["rq".to_string(), "redis-queue".to_string()],
570            requires: vec![],
571            conflicts_with: vec![],
572            is_primary_indicator: false,
573            alternative_names: vec!["Redis Queue".to_string()],
574        },
575        TechnologyRule {
576            name: "Dramatiq".to_string(),
577            category: TechnologyCategory::Library(LibraryType::Utility),
578            confidence: 0.90,
579            dependency_patterns: vec!["dramatiq".to_string()],
580            requires: vec![],
581            conflicts_with: vec![],
582            is_primary_indicator: false,
583            alternative_names: vec![],
584        },
585        TechnologyRule {
586            name: "Huey".to_string(),
587            category: TechnologyCategory::Library(LibraryType::Utility),
588            confidence: 0.85,
589            dependency_patterns: vec!["huey".to_string()],
590            requires: vec![],
591            conflicts_with: vec![],
592            is_primary_indicator: false,
593            alternative_names: vec![],
594        },
595        
596        // TEMPLATE ENGINES
597        TechnologyRule {
598            name: "Jinja2".to_string(),
599            category: TechnologyCategory::Library(LibraryType::Utility),
600            confidence: 0.85,
601            dependency_patterns: vec!["jinja2".to_string(), "Jinja2".to_string()],
602            requires: vec![],
603            conflicts_with: vec![],
604            is_primary_indicator: false,
605            alternative_names: vec![],
606        },
607        TechnologyRule {
608            name: "Mako".to_string(),
609            category: TechnologyCategory::Library(LibraryType::Utility),
610            confidence: 0.85,
611            dependency_patterns: vec!["mako".to_string()],
612            requires: vec![],
613            conflicts_with: vec![],
614            is_primary_indicator: false,
615            alternative_names: vec![],
616        },
617        
618        // AUTHENTICATION & SECURITY
619        TechnologyRule {
620            name: "Authlib".to_string(),
621            category: TechnologyCategory::Library(LibraryType::Utility),
622            confidence: 0.85,
623            dependency_patterns: vec!["authlib".to_string()],
624            requires: vec![],
625            conflicts_with: vec![],
626            is_primary_indicator: false,
627            alternative_names: vec![],
628        },
629        TechnologyRule {
630            name: "Flask-Security".to_string(),
631            category: TechnologyCategory::Library(LibraryType::Utility),
632            confidence: 0.85,
633            dependency_patterns: vec!["flask-security".to_string(), "flask-security-too".to_string()],
634            requires: vec!["Flask".to_string()],
635            conflicts_with: vec![],
636            is_primary_indicator: false,
637            alternative_names: vec!["Flask-Security-Too".to_string()],
638        },
639        TechnologyRule {
640            name: "Django-allauth".to_string(),
641            category: TechnologyCategory::Library(LibraryType::Utility),
642            confidence: 0.85,
643            dependency_patterns: vec!["django-allauth".to_string()],
644            requires: vec!["Django".to_string()],
645            conflicts_with: vec![],
646            is_primary_indicator: false,
647            alternative_names: vec![],
648        },
649        
650        // TESTING (Important for CI/CD)
651        TechnologyRule {
652            name: "pytest".to_string(),
653            category: TechnologyCategory::Testing,
654            confidence: 0.85,
655            dependency_patterns: vec!["pytest".to_string()],
656            requires: vec![],
657            conflicts_with: vec![],
658            is_primary_indicator: false,
659            alternative_names: vec![],
660        },
661        TechnologyRule {
662            name: "unittest".to_string(),
663            category: TechnologyCategory::Testing,
664            confidence: 0.80,
665            dependency_patterns: vec!["unittest".to_string()],
666            requires: vec![],
667            conflicts_with: vec![],
668            is_primary_indicator: false,
669            alternative_names: vec![],
670        },
671        TechnologyRule {
672            name: "Tox".to_string(),
673            category: TechnologyCategory::Testing,
674            confidence: 0.80,
675            dependency_patterns: vec!["tox".to_string()],
676            requires: vec![],
677            conflicts_with: vec![],
678            is_primary_indicator: false,
679            alternative_names: vec![],
680        },
681        TechnologyRule {
682            name: "Nose".to_string(),
683            category: TechnologyCategory::Testing,
684            confidence: 0.75,
685            dependency_patterns: vec!["nose".to_string(), "nose2".to_string()],
686            requires: vec![],
687            conflicts_with: vec![],
688            is_primary_indicator: false,
689            alternative_names: vec!["nose2".to_string()],
690        },
691        TechnologyRule {
692            name: "Behave".to_string(),
693            category: TechnologyCategory::Testing,
694            confidence: 0.85,
695            dependency_patterns: vec!["behave".to_string()],
696            requires: vec![],
697            conflicts_with: vec![],
698            is_primary_indicator: false,
699            alternative_names: vec![],
700        },
701        TechnologyRule {
702            name: "Robot Framework".to_string(),
703            category: TechnologyCategory::Testing,
704            confidence: 0.85,
705            dependency_patterns: vec!["robotframework".to_string()],
706            requires: vec![],
707            conflicts_with: vec![],
708            is_primary_indicator: false,
709            alternative_names: vec![],
710        },
711        
712        // WSGI/ASGI SERVERS (Critical for deployment)
713        TechnologyRule {
714            name: "Gunicorn".to_string(),
715            category: TechnologyCategory::Runtime,
716            confidence: 0.85,
717            dependency_patterns: vec!["gunicorn".to_string()],
718            requires: vec![],
719            conflicts_with: vec![],
720            is_primary_indicator: false,
721            alternative_names: vec![],
722        },
723        TechnologyRule {
724            name: "Uvicorn".to_string(),
725            category: TechnologyCategory::Runtime,
726            confidence: 0.85,
727            dependency_patterns: vec!["uvicorn".to_string()],
728            requires: vec![],
729            conflicts_with: vec![],
730            is_primary_indicator: false,
731            alternative_names: vec![],
732        },
733        TechnologyRule {
734            name: "Hypercorn".to_string(),
735            category: TechnologyCategory::Runtime,
736            confidence: 0.85,
737            dependency_patterns: vec!["hypercorn".to_string()],
738            requires: vec![],
739            conflicts_with: vec![],
740            is_primary_indicator: false,
741            alternative_names: vec![],
742        },
743        TechnologyRule {
744            name: "Daphne".to_string(),
745            category: TechnologyCategory::Runtime,
746            confidence: 0.85,
747            dependency_patterns: vec!["daphne".to_string()],
748            requires: vec![],
749            conflicts_with: vec![],
750            is_primary_indicator: false,
751            alternative_names: vec![],
752        },
753        TechnologyRule {
754            name: "Granian".to_string(),
755            category: TechnologyCategory::Runtime,
756            confidence: 0.85,
757            dependency_patterns: vec!["granian".to_string()],
758            requires: vec![],
759            conflicts_with: vec![],
760            is_primary_indicator: false,
761            alternative_names: vec![],
762        },
763        TechnologyRule {
764            name: "uWSGI".to_string(),
765            category: TechnologyCategory::Runtime,
766            confidence: 0.80,
767            dependency_patterns: vec!["uwsgi".to_string()],
768            requires: vec![],
769            conflicts_with: vec![],
770            is_primary_indicator: false,
771            alternative_names: vec![],
772        },
773        TechnologyRule {
774            name: "Waitress".to_string(),
775            category: TechnologyCategory::Runtime,
776            confidence: 0.80,
777            dependency_patterns: vec!["waitress".to_string()],
778            requires: vec![],
779            conflicts_with: vec![],
780            is_primary_indicator: false,
781            alternative_names: vec![],
782        },
783        
784        // PROCESS MANAGERS & DEPLOYMENT
785        TechnologyRule {
786            name: "Supervisor".to_string(),
787            category: TechnologyCategory::Library(LibraryType::Utility),
788            confidence: 0.80,
789            dependency_patterns: vec!["supervisor".to_string()],
790            requires: vec![],
791            conflicts_with: vec![],
792            is_primary_indicator: false,
793            alternative_names: vec![],
794        },
795        
796        // API DOCUMENTATION & VALIDATION
797        TechnologyRule {
798            name: "Flask-RESTful".to_string(),
799            category: TechnologyCategory::Library(LibraryType::Utility),
800            confidence: 0.85,
801            dependency_patterns: vec!["flask-restful".to_string()],
802            requires: vec!["Flask".to_string()],
803            conflicts_with: vec![],
804            is_primary_indicator: false,
805            alternative_names: vec![],
806        },
807        TechnologyRule {
808            name: "Flask-RESTX".to_string(),
809            category: TechnologyCategory::Library(LibraryType::Utility),
810            confidence: 0.85,
811            dependency_patterns: vec!["flask-restx".to_string()],
812            requires: vec!["Flask".to_string()],
813            conflicts_with: vec![],
814            is_primary_indicator: false,
815            alternative_names: vec![],
816        },
817    ]
818}