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 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
29fn get_python_technology_rules() -> Vec<TechnologyRule> {
31 vec![
32 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 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 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 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 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 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 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 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 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 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 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 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 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}